文件复制-如果名称冲突,则保留两个文件

本文关键字:文件 保留 两个 复制 如果 冲突 | 更新日期: 2023-09-27 18:08:54

File.Copy允许简单的文件复制。当遇到重复的文件名时,file.Copy有第三个参数来确定原始文件是否被覆盖。

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

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

提前谢谢。

文件复制-如果名称冲突,则保留两个文件

不,这个功能并不是开箱即用的(谢天谢地,因为它会给框架带来不应该有的责任*(,所以如果你想要这个,那么你需要实现一个定制的解决方案。

*应该采用哪种实现?追加"-Copy",追加"(n("?它变得很有问题,相当于sherpish

使用File.Copy无法实现一体化,但您可以测试目的地是否存在,然后再测试MoveMove需要两个参数,并且基本上可以同时重命名。

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);
    }
}

请参阅移动文档

编辑:

更新了上面的代码@xanatos对原子操作提出了很好的观点。我没有假设是否有其他进程访问文件。

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

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(;