![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
(По мотивам обсуждения: hashcrc, FarMD5, MD5Arc)
procedure ProcessFile(fileName: string); var f: file; buffer: array [0..32767] of Byte; bytesRead: Longint; begin AssignFile(f, fileName); ResetFile(f, 1); try while not Eof(f) do begin BlockRead(f, buffer, SizeOf(buffer), bytesRead); // Do something with buffer end; finally CloseFile(f); end; end;
Что не так на этой картинке?
function _FilePos(var f: TFileRec): Longint; function _FileSize(var f: TFileRec): Longint; function _EofFile(var f: TFileRec): Boolean; begin Result := _FilePos(f) >= _FileSize(f); end;
Какая прелесть.
На дворе двадцать первый век, когда космические корабли поездят просторы Большого театра, а у них размер файла и позиция в нём — знаковое 32-битное целое.
Что будет с этим кодом, когда ему подсунут двухгигабайтный или больший файл?
Если остаток от деления на 4G будет больше 2G, то _FileSize
выдаст отрицательное значение, и сравнение в _EofFile
выдаст True
с первой ложки.
Если остаток от деления на 4G будет меньше 2G, то из файл всё-таки немного прочитается. Ровно столько, каков остаток.
Мораль? Фреймворки — это хорошо, но за ними тоже нужен глаз да глаз.
no subject
Date: 2007-02-06 21:25 (UTC)Да, а правильный способ обработать весь файл, конечно, —
no subject
Date: 2007-02-06 22:33 (UTC)no subject
Date: 2007-02-06 22:32 (UTC)