2

我最近编写了一个小程序来重命名位于 6 个目录中的一堆文件。程序循环遍历列表中的每个目录,然后使用 File.Move 方法重命名该目录中的每个文件。这些文件被重命名为 cart_buttons_1.png,其中 1 每次递增 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 方法首先检索所有 100 的文件,导致 IOException,因为它试图重命名的文件已经存在于文件夹中。我为此找到的解决方法是选择文件名中包含 100 的所有记录,并将它们全部重命名为“z”或其他名称,以便将它们全部批处理。有关如何解决此问题的任何想法或想法。可能以某种方式对 GetFiles 进行排序以首先查看其他文件。

4

2 回答 2

1

使用 LINQ:

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

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

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

上面假设按文件名_.按文件名分割将产生一个数组,其中第三个值是数值。

于 2012-09-11T15:27:29.997 回答
0

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

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

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

于 2012-09-11T15:28:53.987 回答