2011-01-23 7 views
14

私は虹のテーブルを作成するためのツールをDelphiで作った。ファイルが3.1GBになるまでは問題ありませんでした。私はプログラムを閉じた。その後、私は再びそれを開くと、このコードを実行しながら、それがクラッシュ:Delphi Pascal - 2 GBを超えるファイルにデータを書き込む方法は?

Assign(RainbowFile,'Rainbow_table.txt'); {assign a text file} 
Append(RainbowFile); 

デルファイは、メッセージ 『I/Oエラー131』でエラー「上げexpectionクラスEInOutErrorを示し 私の質問:どのように大きな既存のファイルにデータを追加するために。2ギガバイト //廃止 次の質問より: 私は現在のコードがあります。Content_to_file変数を取り除くためにどのように

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)); 

を、私はそれ `sが可能な場合はWriteBufferメソッドに直接それを入れたい

編集:

TFileStreamは2 GBを超えるファイルで動作します。私は今それをテストしました。 しかし、それはそう書くことが可能である:

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

は、私は、変数引数を渡していないことを意味。または、私は間違いなく変数の最初の文字を渡したのですか?

EDIT 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

ファイルシステムは2GBを超えるファイルをサポートしていますか? – Satya

+0

はい、そうです。私はWindows XP 32ビットを持っています。現在、ファイルはNTFSパーティション上に3.1 GBです。問題は私のパスカルコードです。 – fastman92

答えて

8

一般的な操作のI/Oは現代的な操作には適していません。 TFileStreamクラスを使用するか、細かい制御が必要な場合はWindows APIを直接使用してください(CreateFileWriteFile関数を参照)。

+2

"通常のプロシージャI/Oは、最新の操作には適していません。あなたが話しているこれらのいわゆる「近代的な業務」は何ですか? – dummzeuch

+3

@dummzeuch 2Gbを超える書き込みは、完全に有効な*現代的な操作であり、読み取りも同様です。 –

+0

翻訳:これはバグであり、エンバカデロは気にしないようです。 –

24

ストリームに切り替える必要があります。 TFileStreamはこれを問題なく処理します。ランダムアクセスを使用する場合は、SeekPositionの64ビットバージョンを使用する必要があります。あなたが最後に求めることができ、ファイルストリームを開いた後

Stream.Seek(0, soEnd); 

次に、あなたほどの線を書くことができます。

procedure StreamWriteLine(Stream: TFileStream; Text: string); 
begin 
    Text := Text + sLineBreak; 
    Stream.WriteBuffer(Text[1], Length(Text)*SizeOf(Char)); 
end; 

をうまくいけば、あなたに満たすのに十分な手がかりを与えるべきですその他の詳細については、

+0

次の明らかな問題は、ストリームへの複数引数のwrite()のしくみです。私が必要とするときにストリームが必要な理由の1つ。 –

+0

@Marcoこのようなルーチンを思いついて、それを既存のストリームクラスの周りに包むことはそれほど問題にはなりません。私は個人的には、Delphiで提供されているストリームクラスを直接使用しない傾向がありますが、私のニーズに応える特別な機能を追加する独自のサブクラス化されたバージョンを好んでいます。特に、パフォーマンス上の理由からI/Oをバッファするファイルストリームと、連続するメモリを要求するのではなくブロックを割り当てるメモリストリームがあります。 –

+0

それから私はそれを本当に見たいと思います。書き込み(lN)はコンパイラの魔法を使用します。おそらくtextrecシステムを使いこなすことによっていくつかの方法がありますが、そうするならば、64ビット問題を直接修正するかもしれません。ストリームはIMHOであり、テキストファイルにとってはそれほど快適ではありません。 –

関連する問題