文件使用错误

本文关键字:错误 文件 | 更新日期: 2023-09-27 17:53:52

这段代码是我的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]))为真:

该进程不能访问该文件,因为它正在被另一个进程使用。

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

文件使用错误

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

例如:

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的内容。这解释了错误信息。

您可能需要更仔细地阅读文档。

编辑:

要绝对清楚:FileInfo.Replace并不意味着用于执行文件重命名。它的意思是替换文件内容。要执行重命名,可以使用FileInfo.MoveTo

获取LockHunter。它是一个免费的工具,可以显示哪个进程占用了特定的文件或文件夹。我发现它真的很有用。微软进程资源管理器也是免费的,还可以通过名称查找打开的句柄(Ctrl+F)。