如何允许目录程序代码仅显示C#Windows应用程序的目录路径之间的差异?

时间:2017-09-14 16:35:48

标签: c# directory comparison

对于代码的这一部分,我正在比较用户输入的每个目录。目前,代码列出了每个目录中的所有文件。我一直在寻找一种方法来只列出不同的文件和文件夹,而不是一个文件夹,但是在另一个文件夹中。

代码:

private void btnCompare_Click(object sender, EventArgs e)
    {
        // Clear previous results.
        dgvFiles.Rows.Clear();

        // Get sorted lists of files in the directories.
        string dir1 = txtDir1.Text;
        if (!dir1.EndsWith("\\")) dir1 += "\\";
        string[] file_names1 = Directory.GetFileSystemEntries(dir1, "*",
                   SearchOption.AllDirectories); ;
        for (int i = 0; i < file_names1.Length; i++)
        {
            file_names1[i] = file_names1[i].Replace(dir1, "*.*");

        }
        Array.Sort(file_names1);

        string dir2 = txtDir2.Text;
        if (!dir2.EndsWith("\\")) dir2 += "\\";
        string[] file_names2 = Directory.GetFileSystemEntries(dir2, "*",
                   SearchOption.AllDirectories);
        for (int i = 0; i < file_names2.Length; i++)
        {
            file_names2[i] = file_names2[i].Replace(dir2, "*.*");
        }
        Array.Sort(file_names2);

        // Compare.
        int i1 = 0, i2 = 0;
        while ((i1 < file_names1.Length) && (i2 < file_names2.Length))
        {
            if (file_names1[i1] == file_names2[i2])
            {
                // They match. Display them both.
                dgvFiles.Rows.Add(new Object[] { file_names1[i1], file_names2[i2] });
                i1++;
                i2++;
            }
            else if (file_names1[i1].CompareTo(file_names2[i2]) < 0)
            {
                // Display the directory 1 file.
                dgvFiles.Rows.Add(new Object[] { file_names1[i1], null });
                i1++;
            }
            else
            {
                // Display the directory 2 file.
                dgvFiles.Rows.Add(new Object[] { null, file_names2[i2] });
                i2++;
            }

1 个答案:

答案 0 :(得分:0)

Linq非常简单。

// Get all entries in file_name1 not in file_names2
var diff1 = file_names1.Except(file_names2);
// Get all entries in file_name2 not in file_names1
var diff2 = file_names2.Except(file_names1);
// Union the two diffs
var result = diff1.Union(diff2);
// Get files in both directory
var common = file_names1.Intersect(file_names2);

foreach(string file in common)
  dgvFiles.Rows.Add(new Object[] { file, file });
foreach(string file in diff1)
  dgvFiles.Rows.Add(new Object[] { file, null });
foreach(string file in diff2)
  dgvFiles.Rows.Add(new Object[] { null, file });