Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不覆盖现有文件的情况下复制文件?_C#_.net_Filesystems - Fatal编程技术网

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