2014-09-28 3 views
1

Это мой код.Byte by Byte Обратное чтение файлов

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

ответ

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

EDIT: Мой подход не был хорош, если вы хотите, чтобы пользователь Read(byte[], int, int) метод, вы должны сначала прочитать весь файл, а затем обратный массив, а @Crowcoder отметил в своем решении.

+0

что делать с буфером ... его давая мне ошибку – LeCdr

-1

Просто читать все байты в потоке, кроме того, что в список байтов и обратить его следующим образом:

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

data.Reverse(); 
0

Использование ReadBytes (fs.Length), чтобы получить массив байтов, то используйте цикл на массиве.

+0

совершенный .. решил мою проблему: D – LeCdr

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: Если вы хотите обрабатывать большие файлы (те многих МБ), вы не должны использовать это решение, так как оно может быстро привести к OutOfMemoryException с. Я бы предположил, что вы читаете фрагменты файла с разумным размером (например, 64 КБ) в память (начиная ближе к концу и продолжая путь к началу файла, выполняя запросы) и обрабатывая их один за другим.

Смежные вопросы