2012-09-11 56 views
2

我最近编写了一个小程序来重命名位于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方法首先检索所有带有100的文件,导致IOException,因为它试图重命名的文件已经存在于该文件夹中。我找到的解决方法只是选择文件名中包含100个的所有记录,并将它们全部重命名为'z'或其他内容,以便将它们全部组合在一起。任何想法或想法如何解决这个问题。可能有一些方法可以对GetFiles进行排序,以便首先查看其他人。

回答

1

使用LINQ:

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

注意上面将文本值进行排序,所以你可能要更改,通过数值下令:

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

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

+0

如果我们知道它们都在同一个目录中,那么'(fi => fi.Name)'会稍微快一点吗? – Rotem

+0

@Rotem - 微型优化。 – Oded

+0

数组仍然首先返回cart_buttons_100.png。该文件夹从85开始,运行到115.所以当它排序它仍然会出现:100..115,85,86 ... –

0

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

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

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

+0

该代码还使用StreamWriter将SQL语句写入此循环中的文本文件,这就是为什么我必须多次运行它。接受了您的建议并运行了一次检查,看看该文件是否已经存在,并且只有在没有的情况下才运行File.Move。谢谢一堆! –