2010-11-22 18 views
1

Пожалуйста, покажите мне лучшие/быстрые методы для:C# загрузка двоичных файлов

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

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

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

спасибо !!!

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

P.S.2. Mirror аналогового вопроса для Java;

+1

Вы можете найти следующую статью, чтобы представлять интерес: http://www.codeproject.com/KB/files/ fastbinaryfileinput.aspx – 2010-11-22 14:29:01

ответ

4

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

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

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

4

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

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

3): Использование ReadAllBytes:

byte[] bytes = File.ReadAllBytes(path); 
2

1: для малых, File.ReadAllBytes

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

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

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

-1

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

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; 
    } 
+0

Это не лучше («полезно для обоих»), чем File.ReadAllBytes; зачем изобретать работу? – 2010-11-22 14:35:33

+0

(основной проблемой здесь является необходимость выделения огромного буфера для больших файлов) – 2010-11-22 14:42:17

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