创建一个像Windows7一样的文件副本

时间:2012-10-03 12:22:40

标签: c# wpf windows-7 .net-3.5 copy

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

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

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

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

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

8 个答案:

答案 0 :(得分:6)

您应该提取文件名和扩展名,然后使用新的格式化名称

执行简单的File.Copy
   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'是本地化的,因此它会在非英语版本的操作系统中发生变化。

答案 1 :(得分:3)

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

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

或者:

File.Copy(fileName, string.format("{0} - copy{1}", 
    Path.GetFileNameWithoutExtension(fileName),
    Path.GetExtension(fileName));

答案 2 :(得分:3)

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

答案 3 :(得分:1)

答案 4 :(得分:1)

怎么样:

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

答案 5 :(得分:1)

怎么样

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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