4

こんにちは、一度に 1 バイトずつ逆の順序でファイルを読み取ろうとしています。これまでのところ、ファイルを最初から最後まで読み取って別のファイルに書き込むことしかできませんでした。

ファイルを最後から最初まで読み取って、別のファイルに出力できる必要があります。

これは私がこれまでに持っているものです:

        string fileName = Console.ReadLine();
        using (FileStream file = new FileStream(fileName ,FileMode.Open , FileAccess.Read))
        {

            //file.Seek(endOfFile, SeekOrigin.End);

            int bytes;
            using (FileStream newFile = new FileStream("newsFile.txt" , FileMode.Create , FileAccess.Write))
            {
                while ((bytes = file.ReadByte()) >= 0)
                {
                    Console.WriteLine(bytes.ToString());
                    newFile.WriteByte((byte)bytes);
                }
            }
        }

fileStream で Seek メソッドを使用する必要があることはわかっています。これにより、ファイルの最後にたどり着きます。コードのコメント部分ですでに実行していますが、しばらくの間、ファイルを読み取る方法がわかりません。ループ。

どうすればこれを達成できますか?

4

4 に答える 4

1

一度に 1 バイトずつ読み取るか、より大きなバッファーを読み取って逆に出力ファイルに書き込み、ファイルの先頭に到達するまで同様に続けることができます。例えば:

string inputFilename = "inputFile.txt";
string outputFilename = "outputFile.txt";
using (ofile = File.OpenWrite(outputFilename))
{
    using (ifile = File.OpenRead(inputFilename))
    {
        int bufferSize = 4096;
        byte[] buffer = new byte[bufferSize];
        long filePos = ifile.Length;
        do
        {
            long newPos = Math.Max(0, filePos - bufferSize);
            int bytesToRead = (int)(filePos - newPos);
            ifile.Seek(newPos, SeekOrigin.Set);
            int bytesRead = ifile.Read(buffer, 0, bytesToRead);
            // write the buffer to the output file, in reverse
            for (int i = bytesRead-1; i >= 0; --i)
            {
                ofile.WriteByte(buffer[i]);
            }
            filePos = newPos;
        } while (filePos > 0);
    }
}

明らかな最適化は、バッファーを読み取った後にバッファーを反転し、それを 1 つのチャンク全体として出力ファイルに書き込むことです。

ファイルがメモリに収まることがわかっている場合は、非常に簡単です。

var buffer = File.ReadAllBytes(inputFilename);
// now, reverse the buffer
int i = 0;
int j = buffer.Length-1;
while (i < j)
{
    byte b = buffer[i];
    buffer[i] = buffer[j];
    buffer[j] = b;
    ++i;
    --j;
}
// and write it
File.WriteAllBytes(outputFilename, buffer);
于 2013-04-10T17:33:19.700 に答える