C # загрузка двоичных файлов - PullRequest
1 голос
/ 22 ноября 2010

Пожалуйста, покажите мне лучшие / быстрые методы для:

1) Загрузка очень маленьких двоичных файлов в память. Например значки;

2) Загрузка / чтение очень больших двоичных файлов размером 512 МБ +.

3) Ваш общий выбор, когда вы не хотите думать о размере / скорости, но должны делать только одно: прочитать все байты в память?

Спасибо !!!

P.S. Извините за возможно банальный вопрос. Пожалуйста, не закрывайте его;)

P.S.2. Зеркало аналога вопроса на Java;

Ответы [ 4 ]

4 голосов
/ 22 ноября 2010

1: Для очень маленьких файлов файл .ReadAllBytes будет в порядке.

2: Для очень больших файлов и использования .net 4.0 вы можете использовать MemoryMapped Files.

3: Если не использовать .net 4.0 than, чтение фрагментов данных будет хорошим выбором

4 голосов
/ 22 ноября 2010

1) Я бы использовал файл ресурсов вместо того, чтобы хранить его как множество отдельных файлов.

2) вы, вероятно, хотите передавать данные, а не читать их все сразу, в этом случае вы можете использовать FileStream .

3): использовать ReadAllBytes :

byte[] bytes = File.ReadAllBytes(path);
2 голосов
/ 22 ноября 2010

1: для маленьких File.ReadAllBytes

2: Для большого потока, Stream (FileStream) или BinaryReader в потоке - целью является устранение необходимости выделять большой буфер путем последовательного изменения кода для чтения небольших фрагментов

3: вернуться и найти ожидаемый размер; по умолчанию худший (# 2)

Также обратите внимание, что в первую очередь я бы попытался минимизировать siE, возможно, путем выбора формата данных или сжатия.

0 голосов
/ 22 ноября 2010

Этот пример хорош для обоих - для больших файлов вам нужно буферизованное чтение.

 public static byte[] ReadFile(string filePath)
 {
  byte[] buffer;
  FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
  try
    {
     int length = (int)fileStream.Length;  // get file length
     buffer = new byte[1024];            // create buffer
     int count;                            // actual number of bytes read
     int sum = 0;                          // total number of bytes read

     // read until Read method returns 0 (end of the stream has been reached)
     while ((count = fileStream.Read(buffer, sum, length - sum)) > 0)
      sum += count;  // sum is a buffer offset for next reading
     }
     finally
     {
      fileStream.Close();
     }
      return buffer;
   }
...