簡體   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