2011-09-15 58 views
1

File.Copy允许简单的文件复制。遇到重复的文件名时,File.Copy具有第三个参数以确定原始文件是否被覆盖。文件复制 - 如果名称冲突保留两个文件

是否有内置的.Net功能,允许第三个选项重命名复制的文件,从而保留这两个文件?例如,如果另一个readme.txt已经存在于目标文件夹中,文件副本会自动将“readme.txt”重命名为“readme - Copy.txt” - 类似于Windows资源管理器的功能?

我意识到它可以被写入,但是如果存在的话不想重新发明轮子。

在此先感谢。

+0

如果该参数是“bool”,您认为还有第三种选择吗?我认为你必须自己写这个功能。 –

回答

1

没有什么东西可以与File.Copy一起使用,但是您可以测试目的地是否存在,然后使用Move代替。 Move需要两个参数,并且您可以同时进行基本重命名。

if File.Exists(destinationPath) { 
    File.Move(source, destinationPathRenamed); 
} else { 
    try { 
     File.Copy(source, destinationPath); 
    } catch (IOException ex) { 
     // destinationPath file already exists 
     File.Move(source, destinationPathRenamed); 
    } 
} 

参见Move documentation

编辑:

更新上述代码。 @xanatos关于原子操作有一个很好的观点。我没有假设是否有其他进程访问文件。

请注意,在操作开始之前,我还没有为要删除的源文件添加其他错误处理。

+1

这不是“原子”。该文件可能会出现在Exists之后和Copy之前。 – xanatos

+0

感谢您的回答。 – Dean

+1

@xanatos说得很好。稍微改进我的答案。要真正使它水密,需要大量的检查和错误处理。答案的核心在所有测试和异常处理代码中都会丢失。 –

2

不是,这个功能并不是开箱即用的(幸好,因为它会引入一个它不应该拥有的框架的责任*),所以如果你想要这个,那么你将需要实现一个定制解决方案。

* 哪个实施应该它需要?追加“ - 复制”,追加“(n)”?它变得有问题而相当冷静。

+0

感谢您的回答。 – Dean

0
var destinationPath = c:\temp\archive.txt; 
if(File.Exists(destinationPath)) 
    destinationPath = string.Format("c:\temp\archive.{0}.txt", DateTime.Now.ToString("yyyyMMddHHmmffff")); 

File.Move(filePath,destinationPath);