2

我正在尝试保存一些数据的备份。如果备份存在,那么我想删除它,给最近的文件提供备份文件的名称,然后将新文件保存为最近的文件。

我遇到的问题是,当我删除现有文件时,我仍然无法以相同的名称保存另一个文件。系统仍然认为该文件存在,并且确实在程序抛出异常的那一刻该文件没有被删除,即使这两行紧挨着彼此。我唯一能想到的是,“删除”操作在移动操作想要执行时还没有时间完成。但我不知道如何解决它。

代码看起来像这样。

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

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

4

2 回答 2

2

问题可能与您使用两种不同的.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);

最后不建议自己做路径处理:使用专用方法加入和操作文件路径。

于 2015-11-30T19:56:42.353 回答
1

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

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

但是,如果它对您不起作用,请尝试将备份重命名为“*.bak2”,然后删除该备份。

希望有帮助...

于 2015-11-30T20:03:52.630 回答