创建文件的副本,如 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 通常做的的主要内容,如果未能解决你的问题,请参考以下文章