我有一个.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中显示第一个中没有出现的内容。
非常感谢任何帮助 欢呼声。
答案 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
的两次调用。