对文件数组进行排序以进行重命名

时间:2012-09-11 15:22:50

标签: c# .net

我最近编写了一个小程序来重命名位于6个目录中的一堆文件。程序循环遍历列表中的每个目录,然后使用File.Move方法重命名该目录中的每个文件。这些文件被重命名为cart_buttons_1.png,每次递增1次。

public static int RenameFiles(DirectoryInfo d, StreamWriter sqlStreamWriter, 
                                       int incrementer, int category, int size)
{
    FileInfo[] files = d.GetFiles("*.png");

    foreach (FileInfo fileInfo in files)
    {
        File.Move(fileInfo.FullName, d.FullName + "cart_button_" + incrementer + ".png" );
        incrementer++;
    }

    return incrementer;
}

我遇到的问题是当我多次运行程序时它运行正常,直到它到达包含第100条记录的文件夹。 d.Getfiles方法首先检索100s的所有文件,导致IOException,因为它尝试重命名的文件已经存在于该文件夹中。我找到的解决方法就是选择文件名中包含100的所有记录,并将它们全部重命名为'z'或其他东西,以便它们将它们全部一起批处理。关于如何解决这个问题的任何想法或想法。可能是某种方式来对GetFiles进行排序以首先查看其他文件。

2 个答案:

答案 0 :(得分:1)

使用LINQ:

var sorted = files.OrderBy(fi => fi.FullName).ToArray();

请注意,以上内容将按文字值排序,因此您可能希望将其更改为按数字值排序:

files.OrderBy(fi => int.Parse(fi.Name.Split(new []{'_','.'})[2]))

以上假设按文件名的_.拆分将导致数组的第三个值为数值。

答案 1 :(得分:0)

最简单的解决方法是在尝试复制之前检查目标名称是否存在。由于您已经拥有files数组,因此可以构造目标名称,如果File.Exists()返回true,则跳过该数值。

我还会处理File.Move引发的异常(你想首先测试Existance以避免不必要的异常抛出),因为文件系统在代码工作时没有被冻结......所以甚至测试存在不会确保它不会在此期间创建。

最后,我认为再次针对同一目录运行此代码将再次复制所有文件...可能不是预期的。我会过滤源文件名,避免复制那些已经与你的模式匹配的文件名。