使用错误文件错误

Faulty file in use error

这段代码是我的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])) 为真,我就会收到以下错误:

The process cannot access the file because it is being used by another process.

我在这段代码之前没有打开任何文件,这是怎么回事?

获取 LockHunter。它是一个免费工具,可以向您显示哪个进程占用了特定文件或文件夹。我发现它真的很有用。 Microsoft Process Explorer 也是免费的,还可以按名称查找打开的句柄 (Ctrl+F)。

您应该将阅读逻辑与更新逻辑分开。

例如:

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" 的文件夹中的文件会发生什么?)您可能想解决这个问题。

看来您误解了如何使用 FileInfo.Replace 方法。

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

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

您可能需要更仔细地阅读 documentation

编辑: 绝对清楚:FileInfo.Replace 并不意味着用于执行文件 重命名 。它旨在替换文件 内容 。要执行重命名,请使用 FileInfo.MoveTo.