Delphi Pascal - как записать данные в файл размером более 2 ГБ? - PullRequest
15 голосов
/ 23 января 2011

Я создал инструмент в 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, если это возможно.

РЕДАКТИРОВАТЬ:

TFileStream работает с файлами размером более 2 ГБ. Я проверил это сейчас. Однако можно написать так:

RainbowFile_handle.WriteBuffer( Start_string[1]+':', 

Я имею в виду, чтобы передать переменный аргумент.Или я определенно передал первый символ переменной?

РЕДАКТИРОВАТЬ 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));

Можно ли сделать это безэта переменная?

Ответы [ 2 ]

24 голосов
/ 23 января 2011

Вы должны переключиться на потоки.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;

Надеемся, что это даст вам достаточно подсказок, чтобы заполнить остальные детали.

8 голосов
/ 23 января 2011

Простой ввод-вывод не подходит для современных операций.Просто используйте класс TFileStream или, если вам нужен точный контроль, используйте Windows API напрямую (читайте о функциях CreateFile и WriteFile).

...