已删除的文件仍然存在

本文关键字:存在 文件 删除 | 更新日期: 2023-09-27 18:25:03

我正在尝试保存一些数据的备份。如果备份存在,则我要删除它,为最新的文件指定备份文件的名称,然后将新文件保存为最新文件。

我遇到的问题是,当我删除一个现有文件时,我仍然无法用相同的名称保存另一个文件。系统仍然认为该文件存在,事实上,在程序抛出异常时,即使两行正好在一起,该文件也没有被删除。我唯一能想到的是,到移动操作想要执行时,"删除"操作还没有时间完成。但我不知道如何修复它。

代码看起来像这样。

 File.Delete(filePath.Substring(filePath.Length - 4) + ".bak");
 File.Move(filePath, filePath.Substring(0, filePath.Length - 4) + ".bak");

我想过设置一个计时器,以便稍后执行移动功能,但在我看来,这可能是一种非常草率和危险的处理问题的方式。此外,一个人需要等待的时间可能因系统而异。所以我认为一定有更好的方法。

已删除的文件仍然存在

问题可能与您使用两种不同的.Substring方法有关:String#Substring(int)String#Substring(int,int)。事实上:

File.Delete(filePath.Substring(filePath.Length - 4) + ".bak");
//                   ^ with one int
File.Move(filePath, filePath.Substring(0, filePath.Length - 4) + ".bak");
//                           ^ with two ints

不幸的是,两者在语义上并不等同。带一个int的是起始索引。因此,假设filePath等于test.txt,那么您要删除的文件是.txt.bak,接下来您要将文件移动到test.bak。或者用Mono的C#模拟器运行这个:

csharp> String filePath = "test.txt";
csharp> filePath.Substring(filePath.Length - 4) + ".bak"
".txt.bak"
csharp> filePath.Substring(0, filePath.Length - 4) + ".bak"
"test.bak"

请更新为:

File.Delete(filePath.Substring(0,filePath.Length - 4) + ".bak");
//                   ^ added zero
File.Move(filePath, filePath.Substring(0, filePath.Length - 4) + ".bak");

另一种更优雅、更不容易出错的方法显然是在两者之间使用一个变量,这样你就可以确信,你谈论的是同一个文件:

String backupfile = filePath.Substring(0, filePath.Length - 4) + ".bak";
File.Delete(backupfile);
File.Move(filePath,backupfile);

最后,不建议自己进行路径处理:使用专用方法连接和操作文件路径。

我对您的代码进行了一些更改,结果很好。我只更改了您定义备份文件名的方式,因为文件扩展名可以多于或少于3个字符:

string backupPath = Path.GetFileNameWithoutExtension(filePath) + ".bak";
File.Delete(backupPath);
File.Move(filePath, backupPath);

但如果它不适用于您,请尝试将备份重命名为"*.bak2",然后删除该备份。

希望能有所帮助。。。