C# ZipArchive搜索到listview C

C# ZipArchive搜索到listview C,c#,ziparchive,C#,Ziparchive,我是C的新手 我试图在单击按钮时将搜索结果从文本框显示到列表视图 这是我的密码: private void button1_Click(object sender, EventArgs e) { listView1.Items.Clear(); listView1.Refresh(); string[] filePaths = Directory.GetFiles(@textBox1.Text, "*.zip"); string txtSearch = textB

我是C的新手 我试图在单击按钮时将搜索结果从文本框显示到列表视图

这是我的密码:

private void button1_Click(object sender, EventArgs e)
{
    listView1.Items.Clear();
    listView1.Refresh();
    string[] filePaths = Directory.GetFiles(@textBox1.Text, "*.zip");
    string txtSearch = textBox2.Text;

    foreach (var filePath in filePaths)
    {
        using (ZipArchive archive = ZipFile.OpenRead(filePath))
        {
            foreach (ZipArchiveEntry entry in archive.Entries)
            {
                var position = entry.Name.IndexOf(
                    txtSearch,                                             
                    StringComparison.InvariantCultureIgnoreCase);

                if (position > -1)
                {
                    listView1.Items.Add(entry.Name);
                }
                else
                {
                    MessageBox.Show(
                        "FILE NOT FOUND", 
                        "ERROR", 
                        MessageBoxButtons.OK, 
                        MessageBoxIcon.Error);
                }
            }
        }
    }
}'
如果单个文件夹包含其他存档,但具有以下文件夹结构,则此代码有效: 文件夹包含:文件夹1、文件夹2。 Flodera1包含:、FolderA1.1、FolderA1.2、FolderA1.3和FolderA1.4 FloderA1.1到1.4每个都包含:、文件夹和大量的archives.zip和.rar Flodera2包含:FolderA2.1、FolderA2.2和FolderA2.3。 FloderA2.1到2.3每个都包含:很多archives.zip和.rar

如何使用此代码搜索要列出的具有特定扩展名的文件,即使其中任何文件夹=filepath


提前感谢。

看,我点击了你4次,因为有4次文件找不到,每次都会显示一个消息框。我认为您应该对代码进行一些更改:

foreach (var filePath in filePaths)
    {
        int count=0;
        using (ZipArchive archive = ZipFile.OpenRead(filePath))
        {
            foreach (ZipArchiveEntry entry in archive.Entries)
            {
                var position = entry.Name.IndexOf(txtSearch, StringComparison.InvariantCultureIgnoreCase);
                if (position > -1)
                {
                    listView1.Items.Add(entry.Name);
                    count++;
                }

            }
            if(count==0)
            {
                 MessageBox.Show("FILE "+filepath+ "NOT FOUND", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
使现代化
要获取文件夹及其子文件夹中的所有文件,请阅读此内容。

您被告知4次的原因可能是因为您正在加载的Zip文件中有4项与txtSearch条件不匹配。由于消息框位于内部foreach循环中,因此每次在ZipArchiveEntry中找不到文件时,都会显示消息框

您可以将消息框移动到外部循环,以便每个.zip文件只显示一次。当您使用它时,您可以使用Lambda来简化代码,从而消除对辅助foreach循环的需要。Where子句将过滤掉ZipArchive.Entries集合,然后通过选择集合中每个项的Name属性将结果集转换为字符串集合

private void button1_Click(object sender, EventArgs e)
{
    listView1.Items.Clear();
    listView1.Refresh();
    string[] filePaths = Directory.GetFiles(@textBox1.Text, "*.zip");
    string txtSearch = textBox2.Text;
    var foundEntries = new List<string>();

    foreach (var filePath in filePaths)
    {
        using (ZipArchive archive = ZipFile.OpenRead(filePath))
        {
            foundEntries = archive.Entries
                .Where(e => e.Name.IndexOf(txtSearch, StringComparison.InvariantCultureIgnoreCase) >= 0)
                .Select(e => e.Name);
            if (foundEntries.Any())
            {
                listView1.Items.AddRange(foundEntries);
            }
            else
            {
                MessageBox.Show("FILE NOT FOUND", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        foundEntries.Clear();
    }
}

如果名称不包含指定字符串,则每个zip文件内的每个存档都会显示该消息框。 我想您更愿意只显示一次消息,以防任何zip文件都不包含任何名称包含指定字符串的文件

private void button1_Click(object sender, EventArgs e)
{
    listView1.Items.Clear();
    listView1.Refresh();
    string[] filePaths = Directory.GetFiles(@textBox1.Text, "*.zip");
    string txtSearch = textBox2.Text;

    bool found = false;
    foreach (var filePath in filePaths)
    {
        using (ZipArchive archive = ZipFile.OpenRead(filePath))
        {
            foreach (ZipArchiveEntry entry in archive.Entries)
            {
                var position = entry.Name.IndexOf(txtSearch, StringComparison.InvariantCultureIgnoreCase);
                if (position > -1)
                {
                    found = true;
                    listView1.Items.Add(entry.Name);
                    break;      // Comment out this line if you want more results from a single zip file
                }
            }
        }
    }
    if (!found)
    {
        MessageBox.Show("File not found", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

我可以建议一个显示文件名的更详细的错误消息吗?这可能会有所帮助。这不再是最初的问题。您的更新使这些答案变得毫无意义。I get invaliddataexception已处理错误:中央目录末尾预期的条目数不对应。好的,上面的代码不应该与原始逻辑有任何关系。它只是为filePaths数组中的每个循环添加一个计数变量。到目前为止,您的旧代码是否存在相同的问题?由此产生的3个错误:错误1无法在此作用域中声明名为“e”的局部变量,因为它将赋予“e”不同的含义,而“e”已在“父或当前”作用域中用于表示其他内容。错误2“System.Windows.Forms.ListView.ListViewItemCollection.AddRangeSystem.Windows.Forms.ListView.ListViewItemCollection”的最佳重载方法匹配有一些无效参数错误3参数1:无法从“System.Collections.Generic.List”转换为“System.Windows.Forms.ListView.ListViewItemCollection”,这是因为您正在使用列表视图集合。在你的问题中,你应该更清楚你使用的是什么类型。您的问题说您正在使用一个ListView,它确实有一个AddRange。您需要对用作ListCollectionView源的集合执行AddRange。然后刷新ListCollectionView。至于第一个错误,这很奇怪。您应该能够在每个Linq lambda中嵌套相同的变量名。简单的解决方法是重命名变量。谢谢您的回复。此解决方案使其冻结而不显示任何错误信息。我尝试迭代的文件夹的性质如下: