字节Byte反向文件读取

时间:2014-09-28 11:38:43

标签: c# reverse

这是我的代码。

        string FileName = @"File.txt";    

        if (File.Exists(FileName))
        {
            FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read);

            BinaryReader br = new BinaryReader(fs);

            for (long i = fs.Length; i > 0; i--)
            {
                Console.Write(Convert.ToChar(br.Read()));
            }

        }
        else
        {

但它仍然给我相同的输出..它从头到尾以正确的顺序读取文件。我希望它从上到下阅读。

问题已解决 最终守则

string FileName = @"File.txt";

        if (File.Exists(FileName))
        {
            FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read);
            int length = (int)fs.Length;

            BinaryReader br = new BinaryReader(fs);

            byte[] myArray = br.ReadBytes((int)fs.Length);

            for (long i = myArray.Length - 1; i > 0; i--)
            {
                Console.Write(Convert.ToChar(myArray[i]));
            }
            Console.WriteLine();
        }
        else
        {
            Console.WriteLine("File Not Exists");
        }

5 个答案:

答案 0 :(得分:2)

根据文件的大小,以下解决方案将占用大量内存,因为它将在内存中保存文件内容的两个副本。但是对于较小的文件(认为大小小于约10 MB)应该没问题并且易于理解:

// using System;
// using System.IO;

byte[] fileContents = File.ReadAllBytes(filePath);
byte[] reversedFileContents = Array.Reverse(fileContents);
… // process `reversedFileContents` instead of an input file stream

PS:如果您要处理较大的文件(大小为MB的文件),则不应使用此解决方案,因为它可能很快导致OutOfMemoryException s 。我建议您将合理大小(例如64 KB)的文件块读入内存(从接近结尾开始,然后通过执行搜索继续向文件的开头)并逐个处理这些文件。

答案 1 :(得分:0)

您需要使用Read的不同Read(byte[]buffer, int index, int length)方法(BinaryReader)来指定要读取的数据的起始索引和长度。

for(long i = fs.Length; i > 0; i--)
{
    byte[] buffer = new byte[1];
    br.Read(buffer, i, 1);
    Console.Write(Convert.ToChar(buffer[0]));
}

修改 我的方法并不好,如果你想使用Read(byte[], int, int)方法,你应该首先读取整个文件,然后反转数组,就像他解决方案中提到的@Crowcoder一样。

答案 2 :(得分:0)

使用ReadBytes(fs.Length)获取一个字节数组,然后在数组上使用你的循环。

答案 3 :(得分:0)

我已经发布了一个关于反转文件 here 的答案。

如果您需要在不消耗内存的情况下反转文件,有一个单独的答案here

答案 4 :(得分:-1)

只需读取流中的所有字节,将其保存到字节列表中并将其反转为:

List<byte> data = new List<byte>();
for (int i = 0; i < br.BaseStream.Length; ++i)
  data.Add(br.ReadByte());

data.Reverse();