2

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

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

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

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

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

4

9 回答 9

7

您应该提取文件名和扩展名,然后使用新的格式化名称执行简单的 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 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} - 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”。
您还应该考虑到字符串“Copy”是本地化的,因此它在非英语版本的操作系统中会发生变化。

于 2012-10-03T12:33:26.093 回答
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));
于 2012-10-03T12:26:34.827 回答
3

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

于 2012-10-03T12:34:49.033 回答
1

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

于 2012-10-03T12:26:00.743 回答
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);
        }
    }
于 2012-10-03T12:29:56.553 回答
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);
于 2012-10-03T12:31:24.673 回答
0

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

try
{
File.Copy("",""); 
} 
finally 
{
}
于 2012-10-03T12:26:47.013 回答
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);
于 2012-10-03T12:29:23.823 回答
0

关于史蒂夫的回答(“但如果你真的想模仿 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”。

于 2021-09-11T09:22:48.830 回答