有时,在我的应用程序中,我想创建一个已存在的文件的副本,但我不想测试该文件是否已存在,我只想创建该文件的副本,如Windows 7做。
例如:文件 tips.txt 。当我的应用程序复制它时,将创建另一个名为 tips - copy.txt 的文件。之后,如有必要,请提供“副本副本”提示 - 复制 - 复制.txt 。
在这种情况下我能做些什么吗?
Obs:在这个应用程序中,我使用的是.NET 3.5和WPF。
Obs2:我提出了这个问题,因为我认为在.NET中已经存在类似的东西了。
答案 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)
您可以使用File.Copy
http://msdn.microsoft.com/en-us/library/9706cfs5.aspx
答案 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);