如何比较两个目录并获取丢失的文件?c#winform

如何比较两个目录并获取丢失的文件?c#winform,c#,winforms,directory,compare,C#,Winforms,Directory,Compare,这就是代码: enter code here private void button1_Click(object sender, EventArgs e) { try { string[] Folder1 = Directory.GetFiles(txtFolder1.Text, comboBox1.SelectedItem.ToString()); string[] Folder1FileNames =

这就是代码:

enter code here 

private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            string[] Folder1 = Directory.GetFiles(txtFolder1.Text, comboBox1.SelectedItem.ToString());
            string[] Folder1FileNames = new string[Folder1.Length];
            int c = 0;
            string fname1;


            foreach (string f in Folder1)
            {
                fname1 = Path.GetFileName(f);
                Folder1FileNames[c] = fname1;

                c++;
            }



            string fname2;
            string[] Folder2 = Directory.GetFiles(txtFolder2.Text, comboBox1.SelectedItem.ToString());
            string[] Folder2FileNames = new string[Folder2.Length];
            int t = 0;
            foreach (string f in Folder2)
            {
                fname2 = Path.GetFileName(f);
                Folder2FileNames[t] = fname2;
                t++;

            }
            int m=0;
            foreach (string f in Folder1FileNames)
            {
                while (f != Folder2FileNames[m] && m < Folder2FileNames.Length)
                {
                    m++;
                    if (m == Folder2FileNames.Length)
                    {
                        Label newlabe = new Label();
                        newlabe.Text = f;
                        if(!listBox1.Items.Contains(newlabe.Text))
                        {
                            listBox1.Items.Add(newlabe.Text);

                        }
                    }
                }
                m = 0;
            }



        }
        catch (Exception ex)
        {
            label1.Text = ex.Message;
        }
在此处输入代码
私有无效按钮1\u单击(对象发送者,事件参数e)
{
尝试
{
字符串[]Folder1=Directory.GetFiles(txtFolder1.Text,comboBox1.SelectedItem.ToString());
string[]Folder1FileNames=新字符串[Folder1.Length];
int c=0;
字符串fname1;
foreach(Folder1中的字符串f)
{
fname1=Path.GetFileName(f);
Folder1FileNames[c]=fname1;
C++;
}
字符串fname2;
字符串[]Folder2=Directory.GetFiles(txtFolder2.Text,comboBox1.SelectedItem.ToString());
string[]Folder2FileNames=新字符串[Folder2.Length];
int t=0;
foreach(Folder2中的字符串f)
{
fname2=Path.GetFileName(f);
Folder2FileNames[t]=fname2;
t++;
}
int m=0;
foreach(Folder1FileNames中的字符串f)
{
while(f!=Folder2FileNames[m]&&m
我创建了两个数组,其中包含来自SourceDirectory(Folder1)和CompareDirectory(Folder2)的文件,然后创建了两个以上的数组,其中包含没有完整ptah的文件名(以便在Aray之间进行比较),然后我尝试在数组之间进行比较,并将缺少的文件添加到列表框中。 问题是,当我尝试它时,它给了我源文件夹中第一个丢失的文件(例如,源文件夹包含下一个文件:a.txt、b.txt、c.txt、d.txt,而比较文件夹包含:a.txt、b.txt,列表框中的结果将是c.txt,标签将显示:“您超出了数组索引”) 我该怎么办?
谢谢!

您可以使用更简单、更整洁的解决方案,类似的解决方案应该可以:

var dir1Files = Directory
    .EnumerateFiles(txtFolder1.Text, "*", SearchOption.AllDirectories)
    .Select(Path.GetFileName);
var dir2Files = Directory
    .EnumerateFiles(txtFolder2.Text, "*", SearchOption.AllDirectories)
    .Select(Path.GetFileName);
var diffs = dir1Files.Except(dir2Files).Distinct().ToArray();   

listBox1.Items.AddRange(diffs);

您可以使用更简单、更整洁的解决方案,类似的解决方案应该可以:

var dir1Files = Directory
    .EnumerateFiles(txtFolder1.Text, "*", SearchOption.AllDirectories)
    .Select(Path.GetFileName);
var dir2Files = Directory
    .EnumerateFiles(txtFolder2.Text, "*", SearchOption.AllDirectories)
    .Select(Path.GetFileName);
var diffs = dir1Files.Except(dir2Files).Distinct().ToArray();   

listBox1.Items.AddRange(diffs);

谢谢你们,我用我的方式成功了。 这是我的旧代码:

int m=0;
        foreach (string f in Folder1FileNames)
        {
            while (f != Folder2FileNames[m] && m < Folder2FileNames.Length)
            {
                m++;
                if (m == Folder2FileNames.Length)
                {
                    Label newlabe = new Label();
                    newlabe.Text = f;
                    if(!listBox1.Items.Contains(newlabe.Text))
                    {
                        listBox1.Items.Add(newlabe.Text);

                    }
                }
            }
            m = 0;
        }
intm=0;
foreach(Folder1FileNames中的字符串f)
{
while(f!=Folder2FileNames[m]&&m
新的是:`

 int m = 0;
            foreach (string f in Folder1FileNames)
            {
                m = 0;
                while (f != Folder2FileNames[m] && m < Folder2FileNames.Length-1)
                {
                    m++;
                    if (m == Folder2FileNames.Length-1)
                    {
                        if (Folder2FileNames[m] != f)
                        {

                            Label newlabe = new Label();
                            newlabe.Text = f;
                            if (!listBox1.Items.Contains(newlabe.Text))
                            {
                                listBox1.Items.Add(newlabe.Text);

                            }
                        }


                    }
                }

            }
intm=0;
foreach(Folder1FileNames中的字符串f)
{
m=0;
而(f!=Folder2FileNames[m]&&m

现在它工作得很好,这样我就不会脱离数组索引了

谢谢你们,我用我的方式成功地做到了。
    // Find the set difference between the two folders.  
    // For this example we only check one way.  
    var queryList1Only = (from file in list1  
                          select file).Except(list2, myFileCompare);  

    Console.WriteLine("The following files are in list1 but not list2:");  
    foreach (var v in queryList1Only)  
    {  
        Console.WriteLine(v.FullName);  
    }  
这是我的旧代码:

int m=0;
        foreach (string f in Folder1FileNames)
        {
            while (f != Folder2FileNames[m] && m < Folder2FileNames.Length)
            {
                m++;
                if (m == Folder2FileNames.Length)
                {
                    Label newlabe = new Label();
                    newlabe.Text = f;
                    if(!listBox1.Items.Contains(newlabe.Text))
                    {
                        listBox1.Items.Add(newlabe.Text);

                    }
                }
            }
            m = 0;
        }
intm=0;
foreach(Folder1FileNames中的字符串f)
{
while(f!=Folder2FileNames[m]&&m
新的是:`

 int m = 0;
            foreach (string f in Folder1FileNames)
            {
                m = 0;
                while (f != Folder2FileNames[m] && m < Folder2FileNames.Length-1)
                {
                    m++;
                    if (m == Folder2FileNames.Length-1)
                    {
                        if (Folder2FileNames[m] != f)
                        {

                            Label newlabe = new Label();
                            newlabe.Text = f;
                            if (!listBox1.Items.Contains(newlabe.Text))
                            {
                                listBox1.Items.Add(newlabe.Text);

                            }
                        }


                    }
                }

            }
intm=0;
foreach(Folder1FileNames中的字符串f)
{
m=0;
而(f!=Folder2FileNames[m]&&m
现在它工作得很好,这样我就不会脱离数组索引

    // Find the set difference between the two folders.  
    // For this example we only check one way.  
    var queryList1Only = (from file in list1  
                          select file).Except(list2, myFileCompare);  

    Console.WriteLine("The following files are in list1 but not list2:");  
    foreach (var v in queryList1Only)  
    {  
        Console.WriteLine(v.FullName);  
    }