创建文件的副本,如 Windows7 通常做的

Posted

技术标签:

【中文标题】创建文件的副本,如 Windows7 通常做的【英文标题】:Create a copy of a file like Windows7 usually do 【发布时间】:2012-09-24 08:58:25 【问题描述】:

有时,在我的应用程序中,我想创建一个已经存在的文件的副本,但我不想测试该文件是否已经存在,我只想创建该文件的副本,例如Windows 7 可以。

例如:文件 tips.txt。当我的应用程序复制它时,将创建另一个名为 tips - copy.txt 的文件。之后,如有必要,一份“副本副本”tips - copy - copy.txt

在这种情况下我可以做些什么吗?

Obs:在这个应用程序中,我使用的是 .NET 3.5 和 WPF。

Obs2:我提出这个问题是因为我认为 .NET 中已经存在类似的东西。

【问题讨论】:

你为什么不想测试文件是否已经存在,Windows 会在给出相关提示之前进行测试,那么你为什么不做 Windows 所做的事情呢? 在文件上尝试 ctrl-c ctrl-v。我想创建相同的功能(因为我认为 .NET 中已经存在类似的东西) 【参考方案1】:

您可以使用File.Copy http://msdn.microsoft.com/en-us/library/9706cfs5.aspx

【讨论】:

它会产生一个异常,说文件已经存在。 @FelipeVolpatto - 所以捕获异常并处理它。如果您不想检查文件是否已经存在,那么这是唯一的解决方案。 @Ramhound 不,它不会创建文件。【参考方案2】:

不确定这是否正是您的意思,但是:

string fileName = "tips.txt";
File.Copy(fileName, string.format("0 - copy", fileName);

或者:

File.Copy(fileName, string.format("0 - copy1", 
    Path.GetFileNameWithoutExtension(fileName),
    Path.GetExtension(fileName));

【讨论】:

是的。但是,框架中没有自动执行此操作的东西吗?我不确定,但是 DOS 上的 ROBOCOPY 没有做一些文件这个? @FelipeVolpatto - “自动”到底是什么意思? @pm_2 就像在文件上使用 ctrl-c ctrl-v 一样。【参考方案3】:

好的,不要测试。只需复制文件,不处理异常

try

File.Copy("",""); 
 
finally 


【讨论】:

【参考方案4】:

这样的?我认为有很多更简单的方法可以做到这一点。

string destination = "";
var fileInfo = new FileInfo(@"c:\temp\tips.txt");
var ext = fileInfo.Extension;
var filename = fileInfo.Name.Remove(fileInfo.Name.Length - 4);
File.Copy(fileInfo.FullName, destination + filename + " - Copy" + ext);

【讨论】:

【参考方案5】:

怎么样:

    public static void CopyFileLikeWin7(string pathIn,string fileName, string pathOut)
    
        string potentialFileName = Path.Combine(pathOut,fileName);
        if(File.Exists(potentialFileName))
        
            CopyFileLikeWin7(pathIn, Path.GetFileNameWithoutExtension(fileName) + "-copy" + Path.GetExtension(fileName), pathOut);
        
        else
        
            File.Copy(pathIn,potentialFileName);
        
    

【讨论】:

【参考方案6】:

怎么样

string fileName = "tips.txt";
string filenamewithoutext = Path.GetFileNameWithoutExtension(fileName);
string ext = Path.GetExtension(fileName);
File.Copy(fileName, string.format("0 - Copy1", filenamewithoutext, ext);

【讨论】:

【参考方案7】:

您应该提取文件名和扩展名,然后使用新的格式化名称执行简单的 File.Copy

   string fileName = "tips.txt"; 
   string file = Path.GetFileNameWithoutExtension(fileName);
   string ext = Path.GetExtension(fileName);
   File.Copy(fileName, string.Format("0 - Copy1", file, ext); 

如果你有一个完整路径可以复制,事情会变得有点复杂

   string fileName = "C:\\test\\tips.txt"; 
   string path = Path.GetDirectoryName(fileName);
   string file = Path.GetFileNameWithoutExtension(fileName);
   string ext = Path.GetExtension(fileName);
   File.Copy(fileName, Path.Combine(path, string.Format("0 - Copy1", file, ext)); 

但如果你真的想模仿 Windows Explorer 的行为,我们应该这样做:

string fileName = "C:\\test\\tips.txt"; 
string path = Path.GetDirectoryName(fileName);
string file = Path.GetFileNameWithoutExtension(fileName);
string ext = Path.GetExtension(fileName);
if(file.EndsWith(" - Copy")) file = file.Remove(0, file.Length - 7);
string destFile = Path.Combine(path, string.Format("0 - Copy1", file, ext)); 
int num = 2;
while(File.Exists(destFile))

    destFile = Path.Combine(path, string.Format("0 - Copy (1)2", file, num, ext)); 
    num++;

File.Copy(fileName, destFile); 

如果 Windows 资源管理器复制以“-Copy”结尾的文件,它会向目标文件添加一个渐进式编号,而不是另一个“-Copy”。 您还应该考虑到字符串 'Copy' 是本地化的,因此它在非英语版本的操作系统中会发生变化。

【讨论】:

好的,现在我已经测试了整个东西,它似乎是正确的 +1 我相信您的第三个代码块正是 OP 正在寻找的。但请检查您对大小写的使用(复制与复制)。 是的,这是适合我情况的最佳解决方案。非常感谢,@Steve。【参考方案8】:

如果您想获得与 Windows 复制对话框完全相同的语义,除了建议使用 System.IO 命名空间中的类的其他答案之外,您还可以使用 IFileOperation COM 对象。这是一个managed wrapper。

【讨论】:

【参考方案9】:

关于史蒂夫的回答(“但如果你真的想模仿 Windows 资源管理器的行为,我们应该这样做:”),我发现它非常有用,我有一条评论:

行:

if (file.EndsWith(" - Copy")) file = file.Remove(0, file.Length - 7);

应改为:

if (file.EndsWith(" - Copy")) file = file.Remove(file.LastIndexOf(" - Copy"), file.Length - 7);

,因为如果文件以“ - Copy”结尾,我们会丢失文件名并仅保留“Copy”。

【讨论】:

以上是关于创建文件的副本,如 Windows7 通常做的的主要内容,如果未能解决你的问题,请参考以下文章

centos 使用windows7 存储

创建 github 存储库的“副本”

更新状态 - 为啥在调用 setState 时创建新的状态副本?

从 CMSampleBuffer 中提取数据以创建深层副本

通过requirements.txt文件创建虚拟环境副本

使用文件管理器创建文件副本不适用于 mac app