C# 使用Get文件检查是否存在多个文件,如果确实存在,则复制

C# 使用Get文件检查是否存在多个文件,如果确实存在,则复制,c#,file-exists,getfiles,C#,File Exists,Getfiles,我的桌面上目前有两个文件夹“开始”和“结束”。 “开始”文件夹中可能有任意数量的文件,但我需要解决以下问题 如果文件名存在于开始文件夹中,则检查它们是否存在于结束文件夹中,以及它们是否复制了存在的文件 我在代码中声明了字符串,并使用GetFiles查找每个文件夹中的文件名。但是不能把它拼凑起来 var USERNAME = Environment.UserName; string START_DIRECTORY = @"C:\Users\" + USERNAME + "\\Des

我的桌面上目前有两个文件夹“开始”和“结束”。 “开始”文件夹中可能有任意数量的文件,但我需要解决以下问题

如果文件名存在于开始文件夹中,则检查它们是否存在于结束文件夹中,以及它们是否复制了存在的文件

我在代码中声明了字符串,并使用GetFiles查找每个文件夹中的文件名。但是不能把它拼凑起来

var USERNAME = Environment.UserName;
        string START_DIRECTORY = @"C:\Users\" + USERNAME + "\\Desktop\\START";
        string END_FOLDER_STRING = @"C:\Users\" + USERNAME + "\\Desktop\\END";
        string[] files = System.IO.Directory.GetFiles(START_DIRECTORY);
        string[] files2 = System.IO.Directory.GetFiles(END_FOLDER_STRING);

最简单的方法是:迭代
START\u目录中的每个文件
,并检查结束文件中是否存在相应的文件。如果有,复制它。请注意,就性能而言,这不是最佳解决方案

static void Main(string[] args)
{
    var USERNAME = Environment.UserName;
    string START_DIRECTORY = @"C:\Users\" + USERNAME + "\\Desktop\\START";
    string END_FOLDER_STRING = @"C:\Users\" + USERNAME + "\\Desktop\\END";
    string[] startFiles = System.IO.Directory.GetFiles(START_DIRECTORY);
    string[] endFiles = System.IO.Directory.GetFiles(END_FOLDER_STRING);

    //for every file in start files
    foreach (var startFile in startFiles)
    {
        //get its name
        var startFileName = Path.GetFileName(startFile);
        //and try to get a file with the same name in end file
        var correspondingFineInEndFiles = endFiles.FirstOrDefault(endfile => Path.GetFileName(endfile) == startFileName);
        //if the file in end file does exist
        if (correspondingFineInEndFiles != null)
        {
            //copy it, and override the old file
            File.Copy(startFile, correspondingFineInEndFiles, true);
        }
    }
}
尝试使用,因为大多数情况下,它比遍历两个集合更快:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

...

static void Main(string[] args)
{
    var USERNAME = Environment.UserName;
    string START_DIRECTORY = @"C:\Users\" + USERNAME + "\\Desktop\\START";
    string END_FOLDER_STRING = @"C:\Users\" + USERNAME + "\\Desktop\\END";

    IEnumerable<string> startFiles = Directory.GetFiles(START_DIRECTORY);
    IEnumerable<string> endFiles = Directory.GetFiles(END_FOLDER_STRING);

    foreach(string file in startFiles.Intersect(endFiles, new FileNameEqualityComparer()))
    {
        File.Copy(file, "[the path to the folder where they should be copied]");
    }
}
首先,添加一个名为
filenamequalitycomparer
的类

此类将用于比较元素,以查看它们是否相同。在您的情况下,如果它们的文件名相等,则应返回
true

public class FileNameEqualityComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        if (ReferenceEquals(x, y))
        {
            return true;
        }

        return x != null && y != null && Path.GetFileName(x) == Path.GetFileName(y);
    }

    public int GetHashCode(string obj)
    {
        return Path.GetFileName(obj).GetHashCode();
    }
}

如果要查找两个文件夹中存在的文件名,可以使用以下代码:
var files3=files.Where(f=>files.contains(f))然后您有一个新的文件名列表。如果您想查找结束文件夹中不存在的文件名,可以使用以下命令:
var files4=files.Except(files2)
我认为添加一个
EqualityComparator
对于这个简单的任务来说有点过分了谢谢!这项工作做得很好。不过,将来了解LINQ可能会很有用。