以相反的顺序一次读取一个字节的文件

时间:2013-04-10 16:40:11

标签: c#

您好我试图以相反的顺序一次读取一个字节的文件。到目前为止,我只能设法从开始到结束读取文件并将其写入另一个文件。

我需要能够从头到尾读取文件并将其打印到另一个文件。

这是我到目前为止所做的:

        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方法,这会让我到文件的末尾。我已经在代码的注释中执行了该操作,但我现在不知道如何阅读该文件在while循环中。

我怎么能做到这一点?

4 个答案:

答案 0 :(得分:1)

    string fileName = Console.ReadLine();
    using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        byte[] output = new byte[file.Length]; // reversed file 

        // read the file backwards using SeekOrigin.Current
        //
        long offset;
        file.Seek(0, SeekOrigin.End);        
        for (offset = 0; offset < fs.Length; offset++)
        {
           file.Seek(-1, SeekOrigin.Current);
           output[offset] = (byte)file.ReadByte();
           file.Seek(-1, SeekOrigin.Current);
        }

        // write entire reversed file array to new file
        //
        File.WriteAllBytes("newsFile.txt", output);
    }

答案 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);
    }
}

显而易见的优化是在读取缓冲区之后将其反转,然后将其写入输出文件的整个块中。

如果您知道该文件适合内存,那很简单:

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);

答案 2 :(得分:0)

如果文件很小(适合您的 RAM),那么这将起作用:

public static IEnumerable<byte> Reverse(string inputFilename)
{
    var bytes = File.ReadAllBytes(inputFilename);
    Array.Reverse(bytes);

    foreach (var b in bytes)
    {
        yield return b;
    }
}

用法:

foreach (var b in Reverse("smallfile.dat"))
{

}

答案 3 :(得分:0)

如果文件很大(比你的 RAM 大),那么这会起作用:

using (var inputFile = File.OpenRead("bigfile.dat"))
using (var inputFileReversed = new ReverseStream(inputFile))
using (var binaryReader = new BinaryReader(inputFileReversed))
{
    while (binaryReader.BaseStream.Position != binaryReader.BaseStream.Length)
    {
        var b = binaryReader.ReadByte();
    }
}

它使用可以找到 hereReverseStream 类。