繁体   English   中英

String.Contains给出错误的值

[英]String.Contains gives wrong values

我正在尝试创建一个搜索文件的应用程序,就像WindowsXP一样。 我正在使用4个线程来搜索指定目录并打开每个文件以搜索字符串。 这是通过从静态类调用静态方法来完成的。 然后,该方法尝试找出扩展名,并根据找到的扩展名通过私有方法运行它。 我仅创建了将纯文本文件读取到类的可能性。 这是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Searcher
{
    static public class Searching 
    {
        static public bool Query(string file, string q)
        {
            file = file.ToLower();

            if (file.EndsWith(".txt")) // plain textfiles
            {
                return txt(file, q);
            } // #####################################
            else if (file.EndsWith(".doc"))
            {
                return false;
            } // #####################################
            else if (file.EndsWith(".dll")) // Ignore these
            {
                return false;
            }
            else if (file.EndsWith(".exe")) // Ignore these
            {
                return false;
            }
            else // will try reading as a textfile
            {
                return txt(file, q);
            }
        }

        static private bool txt(string file, string q)
        {
            string contents;
            TextReader read = new StreamReader(file);
            contents = read.ReadToEnd();
            read.Dispose();
            read.Close();

            return contents.ToLower().Contains(q);
        }

        static private bool docx(string file, string q)
        {
            return false;
        }
    }
}

查询读取扩展名,然后转发处理。 由于我目前仅包括纯文本文件,因此选择不多。 在搜索开始之前,我还告诉程序需要读取所有可能的文件。

现在我的问题就在这里,尽管阅读器只能读取纯文本文件,但它也可以读取图像和应用程序(.exe / .dll)。 这是预期的,因为它尝试读取所有内容。 奇怪的是,它返回一个匹配项。 我已经在Notepad ++中搜索了文件,但没有匹配项。 在将文件读入'contents'变量之后,我还通过使用断点提取了内容,并尝试搜索该内容,但又没有匹配项。 因此,这意味着String.Contains()方法对内容的搜索不是很好,该方法似乎认为给定的查询在文件中。

我希望有人知道可能是什么问题。 我搜索的字符串是“ test”,并且该程序在搜索文本文件时有效。

很高兴您找到了解决方案。

我仍然希望看到一些令人讨厌的“误报”文件,以便能够查看。

在此期间,虽然有点切线,但仍然有意义,但我将txt函数更改为:

private bool txt(string file, string q)
{
    string contents = "";
    using (TextReader read = new StreamReader(file))
    {
        contents = read.ReadToEnd();
    }

    return contents.ToLower().Contains(q);
}

这样清洁。

编辑:
好吧,它们返回true的原因是因为这些文件中确实包含字符串“ Test”,特别是: MSI中的[CCP_ TEST RMCCPSearchValidateProductIDSetODBCFoldersAllocateRegistrySpaceNOT]和dll中的[OnUpda teSt ring]。 因此, String.Contains()正常工作。

因此,回到过滤您要搜索的内容。 给出已知文本结尾的列表,或者让用户选择他想要的内容。

您可能要考虑的其他一些事项仅是搜索精确的单词,因此对于OnUpdateStringtest不会正确:)

文本扩展名:在Wiki上 ,在fileinfo

我尝试使用.Dll和exe文件,对我来说效果很好。 之所以如此,是因为文件中存在要搜索的值。 尝试使用记事本打开文件并搜索值。

还尝试搜索“ eafrd”之类的其他字符串而不是test(这是DLL或exe文件中可以存在的词典词)。它返回false。

还可以查看在记事本中打开的文件中是否有任何随机单词,然后尝试搜索它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM