C# 像Windows7通常那样创建文件副本

C# 像Windows7通常那样创建文件副本,c#,wpf,windows-7,.net-3.5,copy,C#,Wpf,Windows 7,.net 3.5,Copy,有时,在我的应用程序中,我想创建一个已经存在的文件的副本,但我不想测试该文件是否已经存在,我只想创建该文件的副本,就像Windows 7那样 例如:文件tips.txt。当我的应用程序复制它时,将创建另一个名为tips-copy.txt的文件。如有必要,在“副本的副本”之后提示-copy-copy.txt 在这种情况下我能做些什么吗 Obs:在这个应用程序中,我使用的是.NET3.5和WPF Obs2:我提出这个问题是因为我认为在.NET中已经存在类似的东西。您可以使用File.Copy 您可以

有时,在我的应用程序中,我想创建一个已经存在的文件的副本,但我不想测试该文件是否已经存在,我只想创建该文件的副本,就像Windows 7那样

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

在这种情况下我能做些什么吗

Obs:在这个应用程序中,我使用的是.NET3.5和WPF


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

您可以使用
File.Copy

您可以使用
文件。复制


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

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


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

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


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

try
{
File.Copy("",""); 
} 
finally 
{
}

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

try
{
File.Copy("",""); 
} 
finally 
{
}

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

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

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

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);
那么:

    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);
        }
    }
那么:

    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);
        }
    }
怎么样

string fileName = "tips.txt";
string filenamewithoutext = Path.GetFileNameWithoutExtension(fileName);
string ext = Path.GetExtension(fileName);
File.Copy(fileName, string.format("{0} - Copy{1}", filenamewithoutext, ext);
怎么样

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

您应该提取文件名和扩展名,然后执行一个简单的文件。使用新的格式化名称进行复制

   string fileName = "tips.txt"; 
   string file = Path.GetFileNameWithoutExtension(fileName);
   string ext = Path.GetExtension(fileName);
   File.Copy(fileName, string.Format("{0} - Copy{1}", 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} - Copy{1}", file, ext)); 
但如果您真的想模仿Windows资源管理器的行为,我们应该:

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} - Copy{1}", 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”。

您还应该考虑字符串“副本”是本地化的,因此它在操作系统的非英语版本中发生变化。

< P>您应该提取文件名和扩展名,然后做一个简单的文件。
   string fileName = "tips.txt"; 
   string file = Path.GetFileNameWithoutExtension(fileName);
   string ext = Path.GetExtension(fileName);
   File.Copy(fileName, string.Format("{0} - Copy{1}", 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} - Copy{1}", file, ext)); 
但如果您真的想模仿Windows资源管理器的行为,我们应该:

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} - Copy{1}", 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”。


您还应该考虑字符串“副本”是本地化的,因此它在操作系统的非英语版本中发生变化。

< P>除了在“代码> Stry.IO < /Cord>命名空间中建议使用类的其他答案之外,如果您想获得与Windows复制对话完全相同的语义,您可以使用COM对象。这里有一个答案。

除了建议在
System.IO
命名空间中使用类的其他答案之外,如果您想获得与Windows Copy对话框完全相同的语义,可以使用COM对象。下面是一个例子。

它将生成一个异常,表明该文件已经存在。@FelipeVolpatto-因此捕获异常并处理它。如果您不想检查文件是否已经存在,那么这是唯一的解决方案。@Ramhound不,它不会创建文件。它会生成一个异常,表明文件已经存在。@FelipeVolpatto-因此捕获异常并处理它。如果您不想检查文件是否已经存在,那么这是唯一的解决方案。@Ramhound No,它不会创建文件。是。但是,框架中不是有一些东西可以自动做到这一点吗?我不确定,但是DOS上的ROBOCOPY不会对这个文件做什么?@FelipeVolpatto-你说的“自动”到底是什么意思?@pmu 2类似于对文件使用ctrl-c ctrl-v。是的。但是,框架中不是有一些东西可以自动做到这一点吗?我不确定,但是DOS上的ROBOCOPY不会对这个文件做什么?@FelipeVolpatto-你说的“自动”到底是什么意思?@pm_2类似于当你对一个文件使用ctrl-c ctrl-v时。你为什么不想测试一下文件是否已经存在,Windows会在给出提示之前测试它,那你为什么不像Windows那样做呢?在一个文件上试试ctrl-c ctrl-v。我想创建相同的功能(因为我认为在.NET中已经存在类似的功能)为什么不测试文件是否已经存在,Windows会在给出提示之前进行测试,那么为什么不执行Windows所做的操作?在文件上尝试ctrl-c ctrl-v。我想创建相同的功能(因为我认为在.NET中已经存在类似的东西)好了,现在我已经测试了所有的东西,它似乎是正确的+1我相信你的第三块代码正是OP想要的。但是,检查一下你对大写字母的使用情况(复制与复制)。是的,这是针对我的情况的最佳解决方案。非常感谢,@Steve.OK现在我已经测试了所有的东西,它似乎是正确的+1我相信你的第三块代码正是OP想要的。但是,检查一下你对大写字母的使用情况(复制与复制)。是的,这是针对我的情况的最佳解决方案。非常感谢,史蒂夫。