2015-11-30 77 views
2

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

我遇到的问题是,当我删除一个现有的文件,我仍然不能保存同名的另一个文件。系统仍认为该文件存在,并且实际上该文件在程序抛出异常的位置不会被删除,即使这两行紧接在一起。我能想到的唯一的事情就是移动操作想要执行的时候,“删除”操作还没有时间完成。但我不知道如何解决它。

代码看起来像这样。

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

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

+6

我觉得FilePath在File.Delete方法中是不正确的。你能检查路径是否正确? – Baskar

+3

尝试先移动文件,然后从原始位置删除最新的文件http://stackoverflow.com/questions/5704982/file-move-fails-when-preceded-by-a-file-delete – keyboardP

回答

2

这个问题有可能做的事实,你使用两种不同的方法.SubstringString#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

我试着用一点点改变你的代码,它工作正常。我只是改变了你如何定义的备份文件的名称,因为文件扩展名可以多于或少于3个字符:

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

但是,如果它不为你工作,尝试重命名为让说,“备份* .bak2“,然后删除那个。

希望可以帮助...

+0

实际上,它不' t工作:OP使用两个语义不同的'String#SubString'版本... –

+1

@CommuSoft你说得对。这是因为我的“小”改变... –

+0

好的。 +1显示更优雅的方式来执行此操作。 –

相关问题