web-dev-qa-db-ja.com

FileStreamおよびこれらのオプションを使用して、テキストファイルの実際の内容を読み取りますc#

FileStreamを使用し、以下で説明するオプションを使用して、C#内でテキストファイルを開く必要があります。

var fileStream = new FileStream(filePath, 
                                FileMode.Open, 
                                FileAccess.Read, 
                                FileShare.Read, 64 * 1024,
                               (FileOptions)FILE_FLAG_NO_BUFFERING | 
                                  FileOptions.WriteThrough & FileOptions.SequentialScan);

テキストファイルには「1」または「0」が含まれており、結果を取得した後、テキストファイルの内容を文字列変数に割り当てます。興味がある場合は、Windowsがキャッシュからテキストファイルを読み取らないようにするために、上記のオプションが必要です。

System.IO.File.ReadAllText()

...十分ではありません。

私がこれまで見た例はバイトとバッファ(この時点で本当に作業する必要がある領域)を含んでいるので、誰かが私のためにこれらの要件を組み込んだ簡単なサブを書くのに十分親切で、それでそれを残しますか? 。

ありがとう

18
user1776480

たぶん次のようなもの:

    FileStream fileStream = new FileStream("[path]", FileMode.Open, FileAccess.Read, FileShare.Read, 64 * 1024,
        (FileOptions)0x20000000 | FileOptions.WriteThrough & FileOptions.SequentialScan);

    string fileContents;
    using (StreamReader reader = new StreamReader(fileStream))
    {
        fileContents = reader.ReadToEnd();
    }


    bool assignedvariable = Convert.ToBoolean(fileContents);

assignvariableは、ファイルに1が含まれる場合はtrue、0が含まれる場合はfalseを保持します。

これが既に回答されている場合は申し訳ありませんが、人々はここに非常に速く投稿します。

22
TheKingDave

StreamReader を使用して、ストリームから読み取ることができます。

string contents;
using(var sr = new StreamReader(fileStream))
{
   contents = sr.ReadToEnd();
}
11
Hans Kesting
File.ReadAllBytes

または

File.ReadAllText

理論的には両方ともWindowsファイルキャッシュを使用します。

this を読んでFILE_FLAG_NO_BUFFERINGのいくつかの制限を理解し、 同様のスタックオーバーフローの質問の場合 も読んでください

4
Paul Zahra

これは私がバイトの配列を読み取るを使用してFileStreamを使用したもので、うまく機能しました。技術的な明確さのために、名前空間を拡張しました。シナリオごとにFileShareおよびFileAccessパラメーターを選択する必要があります。

    byte[] buffer = null;
    using (System.IO.FileStream stm = new System.IO.FileStream("c:\\YourFile.txt", 
               System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None))
    {
    buffer = new byte[stm.Length];
    stm.Read(buffer, 0, Convert.ToInt32(stm.Length));
    }

バイトの配列ではなく文字列としてファイルの内容を読み取る方法?

 string buffer = null;
 using (System.IO.FileStream stm = new 
     System.IO.FileStream("c:\\YourFile.txt",System.IO.FileMode.Open,  
     System.IO.FileAccess.Read, System.IO.FileShare.None))
     {
         using (System.IO.StreamReader rdr = new System.IO.StreamReader (stm))
         {
                        buffer=rdr.ReadToEnd();
         }
     }

StreamReaderが、必要なエンコードを使用してbyte []を文字列に変換するよりも優れている理由

StreamReaderクラスは、ヘッダーバイトを調べてエンコードスキームを決定するため、強力です。 System.Text.Encoding.UTF8.GetString()を使用する必要はありません。

FileStreamを使用する理由とSystem.IO.File.ReadAllBytes/ReadAllTextを使用しない理由ファイルロックメカニズムを正確に制御したかった。私のシナリオでは、着信ファイルのフォルダーをポーリングするプロセスがありました。ファイルを読み取るときに、もう一方の端で低速実行プロセスがジョブを完了し、ファイルがプロセスの読み取りと分析の準備ができていることを確認したかったのです。

ファイル全体を単一のバイト配列として読み取ることの欠点は何ですか?非常に大きなファイルを一度に読み取る場合、RAMに対する要求が高くなります。映画をレンダリングするアプリケーションを考えてください。 100MBのムービーファイルがあります。ファイル全体を一度に読みたくありません。一度に100 KB程度のチャンクで読み取り、シーンをレンダリングしてから次のチャンクに移動する方がいいでしょう。これにより、アプリケーションのスケーラビリティが向上します。ムービーアプリケーションのスケーラビリティが向上しました。 System.IO.OutOfMemoryExceptionのリスクにさらされることなく、非常に大きなムービーを処理できます。

2
Sau001