0

ディレクトリ内のすべてのファイルを反復処理し、部分文字列を検索する小さなプログラムを作成しています。
基本的には次のようなものです。

s = File.ReadAllText(FileName)
If s.Contains("Find this substring") Then
    MatchesFound += 1
End If

このプログラムの正規表現バージョンもありますが、ファイルを読み取るために File.ReadAllText() を使用しています。

バイナリ ファイルで File.ReadAllText() を呼び出すことに注意する必要がありますか?
検索結果にいくつかの誤検知が表示されることは問題ありませんが、プログラムがクラッシュすることは望ましくありません。
MSDN のドキュメントには、ファイル データの読み取りまたは解釈ができないことによるこのメソッドの例外は示されていません。

4

3 に答える 3

2

あなたのプログラムはクラッシュしません。ファイルが長すぎると、多くのメモリを占有する可能性があります。ReadAllText は、ユーザーに戻る前にファイル ハンドルを解放します。そのため、ハンドルは適切に破棄されます。

文字列には、バイナリ ファイルのテキスト表現のみが含まれます。そのほとんどはおそらく無効な文字です。フレームワークは内部的に文字列に Unicode を使用します (UTF16)。

唯一気をつけなければならないのは、4GB の ISO ファイルなどの非常に大きなファイルです。ディレクトリに大きなファイルがある場合は、やみくもに ReadAllText を取得するのではなく、コードを効率的にするためのより良いアルゴリズムを作成する必要があります。

また、読む前に、ファイルサイズを確認できます。純粋なバイナリ ファイルであることが明らかな場合 (例: 100MB zip ファイル); それをスキップして次に進むことができます。

于 2012-06-09T02:31:46.690 に答える
1

コードが機能するはずです。メソッド ReadAllText を呼び出すと、文字列が返されます。したがって、形式が適切でなくても、文字列になってしまいます。

メソッド自体は、ファイル関連の問題に対して例外をスローすることになっています。文字列形式の問題ではありません。

私が考えることができる唯一の問題は、大きすぎてメモリに収まらないファイルを開こうとすると、例外がスローされることです。それ以外の場合、コードは問題なく動作するはずです。

于 2012-06-09T02:31:00.383 に答える
0

ReadAllText推測されたファイルエンコーディングに依存することに注意してください。バイナリ ファイルの文字列は、バイナリ ファイルのヘッダーのために推測されることなく、任意のエンコーディングで格納できます。また、バイナリ ファイルは、UTF-16 文字列がファイル内の奇妙な位置から始まるなどの理由で、リーダーが文字列を適切にデコードしないように、正しくエンコードされた文字列を格納する可能性があることに注意してください。また、読者が UTF-8 エンコーディングを推測した場合、文字列の最初の文字がガベージとしてデコードされる原因となるエンコーディング エラーの余地さえあります。

于 2012-06-09T06:03:31.737 に答える