在 php 中重命名多个文件而不用另一个文件覆盖
Rename multiple files without overwriting one with another in php
我在一个文件夹中有很多文件。我想重命名它们而不用另一个覆盖它们。
假设这些是我的文件名:
- Ana.php
- Maria.php
- Ioana.php
- Georgiana.php
- Bianca.php
我得到一个数组告诉我要重命名哪些文件:
array(
"Maria.php" => "Ioana.php",
"Bianca.php" => "Cristina.php",
"Ioana.php" => "Daniela.php"
)
这些是 Ioana.php
被覆盖的示例。因为Maria.php
"wanted"那个名字。
或者说这个例子:
array(
"Maria.php" => "Ioana.php",
"Ioana.php" => "Maria.php"
)
这些是文件想要切换名称的示例。
我需要一个解决方案,无论应该重命名什么文件,它们都不会覆盖文件夹中的另一个文件。应该重命名的文件数量每次都可能不同。
我需要重命名所有数组文件。问题是如何在不覆盖的情况下做到这一点。
文件名很重要。添加时间戳后缀不是一个好的解决方案。
在重命名文件之前使用file_exists($filename)
检查他是否存在,例如:
<?php
while(count($arr) > 0)
{
foreach ($arr as &$value) {
if (file_exists($value)) {
rename($value,$value + "temp");
}
rename(array_search($value,$arr),$value);
unset($tab[array_search($value, $arr)]);
}
}
?>
你只需要在你的数组上循环,直到所有文件都被重命名
我创建了自己的重命名多个文件夹文件名。
正如我在问题中解释和询问的那样(就在顶部),此功能可防止过度使用。
function rename (array $names): void {
$dirname = '...';
$files = File::folder($dirname); // 'File' is my own static class.
foreach ($names as $key => $name) {
$names[$key] = (basename($name) .'.'. File::extension($key));
// 'File' is my own static class.
}
$duplicates = array(); // for avoiding overwriting
foreach ($files as $key => $file) {
$duplicates[$key] = tempnam(sys_get_temp_dir(), '');
copy($file, $duplicates[$key]);
}
foreach ($names as $key => $name) {
if (isset($files[$key])) { // for preventing non-existent input filename
// remove file if its name isn't used for renaming
if (is_file($files[$key]) && !in_array($key, $names)) {
unlink($files[$key]);
}
rename($duplicates[$key], $dirname .'/'. $names[$key]);
}
}
}
rename(array(
"Maria.php" => "Ioana",
"Bianca.php" => "Cristina",
"Ioana.php" => "Daniela"
)); // Your new names don't have their extension, because you can't change the extension.
我在一个文件夹中有很多文件。我想重命名它们而不用另一个覆盖它们。
假设这些是我的文件名:
- Ana.php
- Maria.php
- Ioana.php
- Georgiana.php
- Bianca.php
我得到一个数组告诉我要重命名哪些文件:
array(
"Maria.php" => "Ioana.php",
"Bianca.php" => "Cristina.php",
"Ioana.php" => "Daniela.php"
)
这些是 Ioana.php
被覆盖的示例。因为Maria.php
"wanted"那个名字。
或者说这个例子:
array(
"Maria.php" => "Ioana.php",
"Ioana.php" => "Maria.php"
)
这些是文件想要切换名称的示例。
我需要一个解决方案,无论应该重命名什么文件,它们都不会覆盖文件夹中的另一个文件。应该重命名的文件数量每次都可能不同。
我需要重命名所有数组文件。问题是如何在不覆盖的情况下做到这一点。
文件名很重要。添加时间戳后缀不是一个好的解决方案。
在重命名文件之前使用file_exists($filename)
检查他是否存在,例如:
<?php
while(count($arr) > 0)
{
foreach ($arr as &$value) {
if (file_exists($value)) {
rename($value,$value + "temp");
}
rename(array_search($value,$arr),$value);
unset($tab[array_search($value, $arr)]);
}
}
?>
你只需要在你的数组上循环,直到所有文件都被重命名
我创建了自己的重命名多个文件夹文件名。
正如我在问题中解释和询问的那样(就在顶部),此功能可防止过度使用。
function rename (array $names): void {
$dirname = '...';
$files = File::folder($dirname); // 'File' is my own static class.
foreach ($names as $key => $name) {
$names[$key] = (basename($name) .'.'. File::extension($key));
// 'File' is my own static class.
}
$duplicates = array(); // for avoiding overwriting
foreach ($files as $key => $file) {
$duplicates[$key] = tempnam(sys_get_temp_dir(), '');
copy($file, $duplicates[$key]);
}
foreach ($names as $key => $name) {
if (isset($files[$key])) { // for preventing non-existent input filename
// remove file if its name isn't used for renaming
if (is_file($files[$key]) && !in_array($key, $names)) {
unlink($files[$key]);
}
rename($duplicates[$key], $dirname .'/'. $names[$key]);
}
}
}
rename(array(
"Maria.php" => "Ioana",
"Bianca.php" => "Cristina",
"Ioana.php" => "Daniela"
)); // Your new names don't have their extension, because you can't change the extension.