![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Считать большой файл частями [D6, D7, WinXP]
Tapok © (2005-11-24 09:27:00)Зравствуйте. Я пишу программу, которая упаковывает несколько файлов в один (что то типа архиватора).
Для расчета размера буфера, в который будет прочитан файл я использую такую функцию
function GetFileBufferSize(DriveName: String; SizeOfFile: Int64): LongWord;
var
MemStatus: MEMORYSTATUS;
SPerClr,BytesPerSector,
NumOfFreeClrs,TtlNumOfClrs: LongWord;
begin
Result := 0;
MemStatus.dwLength := SizeOf(MemStatus);
GlobalMemoryStatus(MemStatus);
//если размер файла превышает доступную физ.память div 2
if SizeOfFile >= (MemStatus.dwAvailPhys div 2) then
begin
GetDiskFreeSpace(PChar(DriveName),SPerClr,
BytesPerSector,NumOfFreeClrs,TtlNumOfClrs);
Result := BytesPerSector; // размер буфера равен размеру кластера
end else
Result := SizeOfFile; // или размеру файла
end;
Дальше файл читается и записывается в архив
while not EOF(F) do
beign
BlockRead(..
BlockWrite(..
end;
С небольшими файлами не возникает проблем, а при чтении больших иногда выскакивает EInOutError.
Можно было бы читать и записывать по одному байту, но это дико медлено...
Подскажите как правильно рассчитать размер буфера для файла?
umbra (2005-11-24 11:19:00) [1]зачем по байту? лучше установить размер буфера кратный размеру страницы памяти (4096 байт). А то если читать покластерно, а файловая система система NTFS, то получится чтение по 512 байт, а в памяти все равно будет занимать страницу