2011-08-03 8 views
0

私はTIdHTTP.Getを使用してファイルをダウンロードしています。パラメータとして私はTFileStreamオブジェクトを渡しています。私はgetメソッドを実行すると、ダウンロードが完了する前にファイルサイズが一度に割り当てられていることに気付きました。私の質問はHow I can avoid which the TIdHTTP component allocate all the file size in the disk at once when use Get?です。使用時にTIdHTTPコンポーネントがすべてのファイルスペースを一度に割り当てるのを避けるにはどうすればよいですか?

+0

ディスク容量が不足している場合は、何をしますか?ダウンロードの75%が失敗しますか?その事前配分は理由のためにそこにあるかもしれません。 –

+0

@Warren - 同意する(私はこれをファイルマネージャなどで嫌う)が、十分なスペースがなく、ダウンロードプロセスの途中で解放する場合、逆の状況を想像する。また、[Content-Length](http://tinyurl.com/Content-Length)はヘッダに含めてはいけませんので、ファイルサイズはあらかじめわかっていないかもしれません。私は、この状況がインディにどのように処理されているのか確認していない。 –

+3

@daemon:事前配分は最適化ですが、それは必要条件ではありません。 Indyのコードには、今後その機能をカスタマイズ可能にするためのTODO項目があります。そのため、最終的に発生する可能性があります。 'Content-Length'が存在しない/使用されていない場合、' TIdHTTP'は既に 'chunked'ダウンロードをサポートしています。この場合、事前割り当ては行われません。 –

答えて

0

Remyがコメントで言ったように応答サイズは(Content-Lengthヘッダーメンバーから)事前にわかっていますが、Indyは常にストリームサイズ全体を事前に割り当てます。

したがって、私の頭に浮かんだディスクスペース割り当てを避ける方法は、メモリストリームを使用して、そのストリームから進行中のファイルにデータをコピーすることです。

ダウンロードしたファイルサイズ全体をディスクにあらかじめ割り当てておくと便利です。なぜならファイルをメモリストリームにダウンロードしても、ハードディスクに十分なスペースを確保しておく必要があるからです。コース自体には十分な空きメモリがあります)。メモリストリームを使用する利点は、ディスクスペースを解放する時間を得ることができることですが、それはあなたがやろうとしていることに大きく依存します。

関連する問題