如何在不覆盖现有文件的情况下复制文件?

How do I copy a file without overwriting an existing file?

我有以下代码将文本文件从一个目录复制到另一个目录并覆盖该文件(如果存在)

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

File.Copy(file, dist, false);

如果您看过MSDN

public static void Copy(string sourceFileName, string destFileName, bool overwrite ) 

Parameters
sourceFileName Type: System.String The file to copy.
destFileName Type: System.String The name of the destination file.
This cannot be a directory.
overwrite Type: System.Boolean true if the destination file can be overwritten; otherwise, false.

并添加异常处理以更改目标文件名并尝试复制直到成功

更新 1 您可以尝试使用上面的代码。在我看来,这比您提供的 link 短。我没有针对任何可能的情况对此进行测试,但是对于像复制 "tmp.txt" 这样存在 "tmp - copy.txt" 和 "tmp - copy (1).txt" 的简单情况,这是可行的。

更新 2 是的,抱歉,使用 .Select 时出现了一个小错误,只有 .Count 我已经修复了它

        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次后的结果如下:

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