我正在尝试保存一些数据的备份。如果备份存在,那么我想删除它,为最新文件提供备份文件的名称,然后将新文件保存为最新文件。
我遇到的问题是当我删除现有文件时,我仍然无法以同一名称保存另一个文件。系统仍然认为该文件存在,并且实际上该文件在程序抛出异常时不会被删除,即使这两行是在彼此之后。我唯一能想到的是,在移动操作想要执行时,“删除”操作没有时间完成。但我不知道如何解决它。
代码看起来像这样。
guard ... else ...
我想过设置一个计时器以便稍后执行移动功能,但在我看来,这可能是处理问题的一种非常草率和危险的方式。此外,需要等待的时间可能因系统而异。所以我认为必须有更好的方法。
答案 0 :(得分: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
不幸的是,这两者在语义上并不相同。 one with one 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);
最后,不建议您自己进行路径处理:使用专用方法来连接和操作文件路径。
答案 1 :(得分:1)
我尝试了一些代码,但是工作正常。我只更改了您定义备份文件名的方式,因为文件扩展名可以多于或少于3个字符:
Table: teams_info
team_id team_name entry_year status
1 team 1 2015 1
2 team 2 2015 1
3 team 2 2016 1
Table: team_players
player_id team_id status members_id position
1 1 0 1 1
2 1 1 2 2
3 1 1 3 3
4 1 1 4 4
5 2 0 5 1
6 2 0 6 2
7 2 1 7 3
Table: members
members_id first_name surname gender
1 joe blogg male
2 james smith male
3 sarah marshall female
4 tony walker male
5 peter jones male
6 jessica varley female
7 jane varley female
但是如果它对您不起作用,请尝试将备份重命名为“* .bak2”,然后删除该备份。
希望有帮助...