0

这里是 C# 新手,在您阅读下文之前,我相信最重要的一条信息可能是我正在远程机器上搜索网络上的共享文件夹,但这仍然不能回答我的问题,为什么要调试模式工作正常。共享文件夹的文件路径位于表单上的文本框中,如下所示:

\\MachineName\jobFolder

所以关于我的问题:

我有一个充满 excel 文件的文件夹,我自己和其他人有时需要使用具有 1 到 5 个条件的 windows 窗体来搜索这些文件,每个“条件”只是一个不同的文本字符串来缩小搜索范围。我只在下面显示了 1 个文本字符串条件,因为其余的都是重复的,如果我能提供帮助,我不想粘贴一堵代码墙。

我知道有更好的方法来搜索 .xls 文件,但我不需要任何花哨的东西,只需要原始文本搜索。我也知道 Windows 搜索也可以做到这一点,但这是一个具有其他功能的表单。

问题,让我感到困惑的是它在调试模式下工作正常,但在正常运行可执行文件时只能通过大约 5,000 个总文件中的前 1/5 左右的文件,有什么想法吗?它没有出现错误,它只是完成,好像一切都按计划进行。这是代码:

string[] words = textBox1.Text.ToUpper().Split(',');
if (words.Length == 1)
{
    foreach (string FileStr in Directory.GetFiles(textBox2.Text, "*.xls" ))
    {
        if (backgroundWorker1.CancellationPending)
        {
            e.Cancel = true;
        }
        else
        {
            try
            {
                if ((File.ReadAllText(FileStr).ToUpper().IndexOf(words[0]) >= 0))
                {
                    Action action = () => listBox1.Items.Add(Path.GetFileName(FileStr));
                    listBox1.Invoke(action);
                }
            }
            catch (Exception)
            {
                MessageBox.Show("error");
            }
        }
    }
}

如果相关,我的工作人员已完成:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        button2.Enabled = true;
        searchButton.Enabled = true;
        searchButton.Text = "Search";
        button4.BackColor = SystemColors.Control;
        searchButton.BackColor = SystemColors.Control;
        MessageBox.Show("Error: " + e.Error.Message);
        textBox1.Enabled = true;
    }
    else if (e.Cancelled)
    {
        button2.Enabled = true;
        searchButton.Enabled = true;
        searchButton.Text = "Search";
        button4.BackColor = SystemColors.Control;
        searchButton.BackColor = SystemColors.Control;
        MessageBox.Show("canceled.", "Canceled");
        textBox1.Enabled = true;
    }
    else
    {
        button2.Enabled = true;
        searchButton.Enabled = true;
        searchButton.Text = "Search";
        button4.BackColor = SystemColors.Control;
        searchButton.BackColor = SystemColors.Control;
        MessageBox.Show("Search Complete", "Complete");
        textBox1.Enabled = true;
    }
}
4

1 回答 1

0

您正在打开 excel 文件并将它们作为纯文本读取。无论words您使用什么来搜索此文本,充其量只能勉强发挥作用。Excel 文件格式因您运行的 Excel 版本而异。 xls保存为二进制文件。较新的xlsx文件具有更高级别的可读性,因为它们是基于 xml 的。您根本无法读出纯文本,除了高水平的废话:

System.IO.File.ReadAllText(FileStr)//其中FileStr是一个excel文件

您应该切换到适用于 Office 的 Visual Studio Tools版本以获得准确的结果。VSTO 是一个 API,允许您使用 C# 以编程方式读取 excel 电子表格。

于 2013-11-10T03:46:32.030 回答