- Код: Выделить всё
procedure DoReadFile(FileName:string);
var f:file of Byte;
Buf: Array [1..32767] Of Byte;
NumRead: Word;
begin
assign(f,FileName);
reset(f);
repeat
BlockRead(F, Buf, SizeOf(Buf), NumRead);
until NumRead = 0;
close(f);
end;
Каково же было моё удивление, когда я при выполнении этого кода словил эксцепшн Access denied. Какого-то лешего при считывании файла FreePascal открывает его на запись. WTF!?! - подумал я.
Ну как известно, у проблемы есть два решения - быстрое и неправильное, и медленное, трудоёмкое и правильное. Быстро - я снял со всех файлов атрибуты ReadOnly, и проблема исчезла. Медленно - потом переписал функцию с использованием CopyFileEx. Проблема исчезла совсем.
Всё же вопрос со скоростью операции BlockRead файла в большой буфер меня занимал, и я снова вернулся к этой функции. И уже на Array [1..131071] паскаль скрутил мне фигу, выдав предупреждение. Но мы тоже не лыком шиты, у нас же есть динамические массивы! И точно, с ними можно устанавливать размер хоть в 1048575. А вот тут меня и подстерегал очередной облом. Как честный ёжик, я считаю правильным освободить память после её использования. Но присвоение массиву значения NIL или же setlength его в 0(все операции взяты со странички FreePascal вики) приводило(и приводит) меня к SigSegv. Можно подумать, во всём виноваты слишком большие значения границ массива, но я наступил на грабли SigSegv даже с абсолютно рабочим значением 32767, которое без проблем проходит в статике. WTF!?!#2 - подумал я.
И вот второй WTF мне победить не удалось. Кто что посоветует?