Delphi Pascal - как записать данные в файл размером более 2 ГБ?
Я сделал инструмент в Delphi, чтобы создать радужный стол. Это было прекрасно, пока файл не вырос до 3,1 ГБ. Я закрыл свою программу. Затем я открыл его снова, и он сработает при выполнении этого кода:
Assign(RainbowFile,'Rainbow_table.txt'); {assign a text file}
Append(RainbowFile);
Delphi показывает ошибку "повышенный класс проверки EInOutError с сообщением" Ошибка ввода-вывода 131 ".
Мой вопрос: как добавить данные в существующий файл размером более 2 ГБ.
// Устаревшее
Следующий вопрос:
У меня есть код:
Content_to_file := (#13+#10+Start_string+':'+hexstr(GTA_San_Andreas_CRC32(Start_string), 8));
RainbowFile_handle.WriteBuffer( Content_to_file[1], Length(Content_to_file)*SizeOf(Char));
Как избавиться от переменной Content_to_file. Я хочу поставить его прямо в WriteBuffer, если это возможно.
EDIT:
TFileStream работает с файлами размером более 2 ГБ. Я протестировал его сейчас.
Однако можно ли написать так:
RainbowFile_handle.WriteBuffer( Start_string[1]+':',
Я хочу передать аргумент переменной. Или я определенно передаю первую переменную char?
ИЗМЕНИТЬ 2:
В настоящее время я сделал это так:
Content_to_file := (#13+#10+Start_string+':'+hexstr(GTA_San_Andreas_CRC32(Start_string), 8));
RainbowFile_handle.WriteBuffer( Content_to_file[1], Length(Content_to_file)*SizeOf(Char));
Можно ли сделать это без этой переменной?
Ответы
Ответ 1
Вы должны переключиться на потоки. A TFileStream
справится с этим без проблем. Обратите внимание: если вы используете произвольный доступ, вы должны убедиться, что используете 64-битные версии Seek
и Position
.
После того, как вы открыли поток файлов, вы можете найти его до конца:
Stream.Seek(0, soEnd);
Затем вы можете писать строки так:
procedure StreamWriteLine(Stream: TFileStream; Text: string);
begin
Text := Text + sLineBreak;
Stream.WriteBuffer(Text[1], Length(Text)*SizeOf(Char));
end;
Надеюсь, это должно дать вам достаточно информации, чтобы заполнить остальные детали.
Ответ 2
Обычная процедура ввода-вывода не подходит для современных операций. Просто используйте класс TFileStream
или, если вам нужен тонкий контроль, напрямую используйте Windows API (читайте CreateFile
и WriteFile
).