C# 如何在不覆盖现有文件的情况下复制文件?
我有下面的代码,可以将文本文件从一个目录复制到另一个目录,如果存在,则覆盖该文件C# 如何在不覆盖现有文件的情况下复制文件?,c#,.net,filesystems,C#,.net,Filesystems,我有下面的代码,可以将文本文件从一个目录复制到另一个目录,如果存在,则覆盖该文件 string[] dirs = Directory.GetDirectories(path, "*", SearchOption.TopDirectoryOnly); string[] files = Directory.GetFiles(dirs[0]); foreach (string file in files) { string fname = fi
string[] dirs = Directory.GetDirectories(path, "*", SearchOption.TopDirectoryOnly);
string[] files = Directory.GetFiles(dirs[0]);
foreach (string file in files)
{
string fname = file.Substring(dirs[0].Length + 1);
string dist = Path.Combine(dirs[1], fname);
File.Copy(file, dist, true);
}
我要找的是将文件复制到目标目录而不覆盖,但保留两个文件。例如,在Windows中,多次使用名为“test”的文件的副本
test
test - Copy
test - Copy (2)
test - Copy (3)
text
text- Copy
text- Copy (2)
text- Copy (3)
任何帮助都将不胜感激 改变你的想法
File.Copy(file, dist, true);
到
如果你看过
参数sourceFileName类型:系统。字符串要复制的文件。
destFileName类型:系统。字符串目标文件的名称。
这不能是目录。
覆盖类型:System.Boolean如果目标文件可以 覆盖;否则,错误 并添加异常处理,即更改目标文件名并尝试复制,直到复制成功 更新1 您可以尝试使用上述代码。在我看来,这似乎比你提供的链接短。我没有对任何可能的情况进行测试,但是对于简单的情况,比如复制“tmp.txt”,而存在“tmp-copy.txt”和“tmp-copy(1.txt)”,这是可行的 更新2是的,很抱歉,使用时出现了一个小错误。选择并仅限于。计数我已修复它
string sourcePath = @"c:\Users\Admin\Desktop\tmp\test1\";
string destinationPath = @"c:\Users\Admin\Desktop\tmp\test2\";
string[] files = Directory.GetFiles(sourcePath);
foreach (string file in files)
{
string fname = file.Substring(sourcePath.Length);
string dest = Path.Combine(destinationPath, fname);
if (File.Exists(dest))
{
var existingFiles = Directory.GetFiles(destinationPath);
var fileNum = existingFiles.Count(x => x.Substring(destinationPath.Length).StartsWith(Path.GetFileNameWithoutExtension(fname)));
dest = Path.Combine(destinationPath, Path.GetFileNameWithoutExtension(dest) + " copy" + (fileNum > 1 ? " (" + (fileNum - 1) + ")" : "") + Path.GetExtension(dest));
File.Copy(file, dest);
}
else
{
File.Copy(file, dest);
}
}
重复将同一文件夹复制到同一目标文件夹5次后的结果如下:@FSm yeah抱歉,忘记添加关于添加handling@FSm如果你没想到怎么做,我可以写密码。彼得罗索夫,你是对的。实际上,在这里可以找到一个相对的解决方案。然而,一些新的想法可能会出现helpful@FSm我已经更新了我的答案,但正如您所理解的,如何实现这一点的全局想法与我之前提供的想法非常接近。它可能只适用于一次文件创建,我创建了一个方法来处理每次程序运行时的情况,然后将文件复制为OPFor长代码块,如下所示,最好添加一个解释,或者至少对重要部分进行评论。
public static void Copy(string sourceFileName, string destFileName, bool overwrite )
string sourcePath = @"c:\Users\Admin\Desktop\tmp\test1\";
string destinationPath = @"c:\Users\Admin\Desktop\tmp\test2\";
string[] files = Directory.GetFiles(sourcePath);
foreach (string file in files)
{
string fname = file.Substring(sourcePath.Length);
string dest = Path.Combine(destinationPath, fname);
if (File.Exists(dest))
{
var existingFiles = Directory.GetFiles(destinationPath);
var fileNum = existingFiles.Count(x => x.Substring(destinationPath.Length).StartsWith(Path.GetFileNameWithoutExtension(fname)));
dest = Path.Combine(destinationPath, Path.GetFileNameWithoutExtension(dest) + " copy" + (fileNum > 1 ? " (" + (fileNum - 1) + ")" : "") + Path.GetExtension(dest));
File.Copy(file, dest);
}
else
{
File.Copy(file, dest);
}
}
string extention = ".txt";
string originalFileName = string.Format("test{0}", extention);
string duplicateFileName = "test";
string changedName = duplicateFileName;
int count = 1;
while (File.Exists(changedName + extention))
{
changedName = string.Format("{0} - Copy ({1})",
duplicateFileName, count++);
}
File.Copy(originalFileName, changedName + extention);
try
{
if (!string.IsNullOrEmpty(txtsource.Text) &&
Directory.Exists(txtsource.Text) &&
!string.IsNullOrEmpty(txtdestination.Text) &&
Directory.Exists(txtdestination.Text))
{
DirectoryInfo dir = new DirectoryInfo(txtsource.Text);
FileInfo[] files = dir.GetFiles();
var filtered = files.Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden));
foreach (var file in filtered)
{
try
{
string tempPath = Path.Combine(txtdestination.Text, file.Name);
var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(tempPath);
var fileExtension = Path.GetExtension(tempPath);
while (true)
{
if (File.Exists(tempPath))
{
if (!Path.GetFileNameWithoutExtension(tempPath).EndsWith(" - copy"))
{
var existingFiles = Directory.GetFiles(txtdestination.Text);
tempPath = Path.Combine(txtdestination.Text, fileNameWithoutExtension + " - copy" + fileExtension);
continue;
}
else if (Path.GetFileNameWithoutExtension(tempPath).EndsWith(" - copy") ||
Regex.IsMatch(Path.GetFileNameWithoutExtension(tempPath), @" ^.*- copy \(\d+\)"))
{
var existingFiles = Directory.GetFiles(txtdestination.Text);
var fileNum = existingFiles.Count(x => x.Substring(txtdestination.Text.Length).StartsWith(Path.GetFileNameWithoutExtension(tempPath)) &&
(Regex.IsMatch(Path.GetFileNameWithoutExtension(tempPath), @" .*- copy$") || Regex.IsMatch(Path.GetFileNameWithoutExtension(tempPath), @" .*- copy \(\d+\)$")));
tempPath = Path.Combine(txtdestination.Text, Path.GetFileNameWithoutExtension(tempPath) + (fileNum >= 1 ? " (" + fileNum + ")" : "") + Path.GetExtension(tempPath));
continue;
}
}
break;
}
file.CopyTo(tempPath, false);
}
catch (Exception exception)
{
Console.WriteLine(exception);
throw;
}
}
}
}
catch (Exception exception)
{
Console.WriteLine(exception);
throw;
}