错误的文件正在使用错误

时间:2015-06-05 06:37:39

标签: c# winforms io

此代码是我Form_Load方法中的第一个代码:

DirectoryInfo dir =new DirectoryInfo("d:\\themes.thumb");

string[] animals = new string []
{
    "Snakes",
    "SnowyOwls",
    "Tigers",
    "TropicalFish",
    "WildBeauty",
    "Wolves"
};

foreach (FileInfo fil in dir.GetFiles())
{
    for(int ii=0;ii<animals.Length;ii++)
    {
        if (fil.Name.StartsWith(animals[ii]))
        {
        try
        {
            fil.Replace(fil.FullName,fil.FullName.Replace(fil.Name,"Animals-" + fil.Name));
        }
        catch
        {
        }
    }
}

,只要if (fil.Name.StartsWith(animals[ii]))成立,我就会收到以下错误:

  

该进程无法访问该文件,因为该文件正由另一个进程使用。

由于我在此代码之前没有打开任何文件,有什么问题?

3 个答案:

答案 0 :(得分:1)

您应该从更新逻辑中分离您的阅读逻辑。

例如:

var replacements = dir.GetFiles()
                      .Where(file => animals.Any(animal => file.Name.StartsWith(animal)))
                      .Select(file => new 
                                     {
                                       OldFullName = file.FullName, 
                                       NewFullName = file.FullName.Replace(file.Name, "Animals-" + file.Name) 
                                     })
                      .ToList();

foreach (var replacement in replacements)
{
    File.Move(replacement.OldFullName, replacement.NewFullName);
}

您的替换逻辑有一些微妙的错误(例如,在名为“Wolves”的文件夹中的文件会发生什么?)您可能想要解决这个问题。

答案 1 :(得分:1)

您似乎误解了如何使用FileInfo.Replace方法。

fil.Replace(fil.FullName,fil.FullName.Replace(fil.Name,"Animals-" + fil.Name));

这里你实际上试图用自己覆盖fil的内容。这解释了错误消息。

您可能希望更仔细地阅读documentation

修改 要绝对清楚:FileInfo.Replace并非用于执行文件重命名。这意味着要替换文件内容。要执行重命名,请使用FileInfo.MoveTo

答案 2 :(得分:0)

获取LockHunter。它是一个免费工具,可以显示哪个进程保存在特定文件或文件夹中。我觉得它真的很有用。 Microsoft Process Explorer也是免费的,也可以按名称找到打开的句柄(Ctrl + F)。