0

一時ファイルに書き込むときにバイトを逆にする必要があるため、一度に読み込む必要がある非常に大きな BMP ファイルがあります。この BMP は 1.28GB で、「メモリ不足」エラーが発生します。そのサイズの配列を初期化できないため、(ReadAllBytes を使用して) 完全に読み取ることも、バイナリ配列へのバッファーを使用することもできません。また、途中でメモリが不足するため、バッファーを使用してリストに読み込むこともできません (Reverse() を使用できます)。

基本的に問題は、非常に大きなファイルを逆方向​​ (つまり、LastByte から始まり FirstByte で終わる) に読み取り、それをディスクに書き込むにはどうすればよいかということです。

おまけ: 反転したファイルをディスクに書き込むときは、最後の 54 バイトを書き込まないでください。

4

3 に答える 3

4

StreamReaderオブジェクトを使用すると、任意の特定のバイトにシーク(「カーソル」を置く) ことができるため、それを使用してファイル全体の内容を逆方向に調べることができます。

例:

const int bufferSize = 1024;
string fileName = 'yourfile.txt';

StreamReader myStream = new StreamReader(fileName);
myStream.BaseStream.Seek(bufferSize, SeekOrigin.End);

char[] bytes = new char[bufferSize];
while(myStream.BaseStream.Position > 0)
{
    bytes.Initialize();
    myStream.BaseStream.Seek(bufferSize, SeekOrigin.Current);
    int bytesRead = myStream.Read(bytes, 0, bufferSize);
}
于 2013-04-08T08:45:59.730 に答える
4

32 プラットフォームでも 64 プラットフォームでも、CLR アプリケーションとその内部のコレクションには暗黙のメモリ制限があるため、通常、.NET でそれほど大きなファイルを処理することはできません。

このために、 Memory Mapped Fileを使用して、ファイルをメモリにロードせずにディスクから直接読み取ることができます。作成された 1 回限りのメモリ マッピングは、読み取りポインターをファイルの最後に移動し、逆方向に読み取ります。

お役に立てれば。

于 2013-04-08T08:45:34.347 に答える
2

メモリ マップト ファイルを使用できます。

http://msdn.microsoft.com/en-us/library/vstudio/dd997372%28v=vs.100%29.aspx

また、FileStream を使用し、stream.Seek(xxx, SeekOrigin.Begin) (相対位置) または Position プロパティ (絶対位置) によって必要な位置に配置することができます。

于 2013-04-08T08:45:40.680 に答える