读取listView的内容,并根据目录的内容在另一个listView中显示缺少的项目

时间:2016-11-28 21:45:50

标签: c# .net listview

我有一个.NET webform,它显示listView中目录中的文件。这是显示的代码:

Dim apptype as String = "game"
Dim appname as String = "Dead by Daylight"

label2.Text包含容纳文件的目录。我需要的是第二个listView显示容纳在另一个目录中的文档列表,以显示该文件是否未出现在第一个列表视图中。

第二个目录包含模板,其中第一个目录包含已完成的文档。每个目录中的名称不同,但它们是相似的。例如,在第一个listView中显示的已完成文档可以称为DEFECT1_AA09890.doc。它的模板可以称为05DEFECT.doc。

使用以下代码显示模板目录的内容很容易:

private void files()
{
    try
    {
        DirectoryInfo dinfo = new DirectoryInfo(label2.Text);
        FileInfo[] Files = dinfo.GetFiles("*.doc");
        foreach (FileInfo file in Files)
        {
            listView1.Items.Add(file.Name);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

但是这不会根据结果比较内容和显示。

长话短说,我想在listView中显示目录的内容,将其与另一个目录的内容进行比较,并在第二个listView中显示第一个中没有出现的内容。

非常感谢任何帮助 欢呼声。

1 个答案:

答案 0 :(得分:1)

在向listView2添加文件名之前,您需要检查是否已将其添加到listView1。一种方法是将listView1中的文件存储在HashSet<string>中,然后在添加到listView2之前检查该文件。这样的事情应该有效:

private void filesAndTemplates()
{
    string path = @"\\directoryname\foldername";
    HashSet<string> files = new HashSet<string>();

    try
    {
        DirectoryInfo dinfo = new DirectoryInfo(label2.Text);
        FileInfo[] Files = dinfo.GetFiles("*.doc");
        foreach (FileInfo file in Files)
        {
            files.Add(file.Name);
            listView1.Items.Add(file.Name);
        }

        dinfo = new DirectoryInfo(path);
        Files = dinfo.GetFiles("*.doc");
        foreach (FileInfo file in Files)
        {
            if (files.Contains(file.Name))
            {
                continue; // We already saw this file
            }

            listView2.Items.Add(file.Name);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

修改

如果你想要不精确的匹配,你需要将文件名减少到它的本质 - 删除任何装饰,在你的情况下看起来是一个(或两个)

  • 领先数字
  • 下划线,然后是

01hello_world.doc的本质因此是hello

Regex应该很合适 - 尽管正则表达式的确切定义取决于您的确切要求。

在适当的地方定义Regex和转换方法:

private static readonly Regex regex = new Regex(
    @"[0-9]*(?<core>[^_]+)(_{1}.*)?", RegexOptions.Compiled);

private static string Transform(string fileName)
{
    int extension = fileName.LastIndexOf('.');
    if (extension >= 0)
    {
        fileName = fileName.Substring(0, extension);
    }

    Match match = regex.Match(fileName);
    if (match.Success)
    {
        return match.Groups["core"].Value;
    }

    return fileName;
}

然后修改原始方法以在将文件添加到HashSet之前和检查它们的存在之前转换文件名:

DirectoryInfo dinfo = new DirectoryInfo(label2.Text);
FileInfo[] Files = dinfo.GetFiles("*.doc");
foreach (FileInfo file in Files)
{
    files.Add(Transform(file.Name)); // Here!
    listView1.Items.Add(file.Name);
}

dinfo = new DirectoryInfo(path);
Files = dinfo.GetFiles("*.doc");
foreach (FileInfo file in Files)
{
    if (files.Contains(Transform(file.Name))) // Here!
    {
        continue;
    }

    listView2.Items.Add(file.Name);
}

请注意对Transform的两次调用。