TIdHTTPServer
関数を使用して、クライアントにファイルを提供するために作業していResponseInfo->ServeFile
ます。これは、「静的」なファイル、つまり他のプロセスによって書き込まれていないファイルに対してはうまく機能します。コードからわかる限り、ServeFile 関数は内部的に を使用しているため、書き込みTIdReadFileExclusiveStream
中のファイルを読み取ることができませんが、他のプロセスによって書き込まれているファイルも送信できる必要があります。
そのため、私は自分で FileStream を作成し、ContentStream
プロパティを使用してそれをクライアントに返すようにしましたが、クライアントで 0 バイトのファイルを取得し (ファイルが書き込まれているかどうかに関係なく)、何が表示されているかわかりません。 m 行方不明または間違っています。OnCommandGet
イベントハンドラーで使用しているコードは次のとおりです。
AResponseInfo->ContentStream = new TFileStream(path, fmOpenRead | fmShareDenyNone);
AResponseInfo->ContentStream->Position = 0;
AResponseInfo->ContentLength = AResponseInfo->ContentStream->Size;
AResponseInfo->ResponseNo = 200;
AResponseInfo->WriteHeader();
AResponseInfo->WriteContent();
この時点での ContentLength プロパティには有効な値 (つまり、ContentStream->Size を呼び出したときのファイル サイズ) があり、ファイルが途中で変更されたとしても、それをクライアントに送信したいと考えています。
WriteContent() 関数、WriteHeader() を削除しようとしましたが、結果は同じです。いくつかの例を検索しましたが、見つかったいくつかはこのコードとほぼ同じであるため、何が問題なのかわかりません。ほとんどの例には WriteContent() 呼び出しが含まれていないため、それらを削除しようとしましたが、違いはないようです。
補足として、書き込み中のファイルは書き込みが完了するまでに 24 時間かかりますが、それはクライアント側から予想されることです。必要なのは、要求時に既に書き込まれているバイトだけです (多少少なくても有効です)。ファイルが削除されることはありません。ファイルは大きくなり続けるだけです。
何か案は?
アップデート
Fiddler を使用すると、これに関連するプロトコル違反に関する警告が表示されます。たとえば、次のようになります。
Content-Length mismatch: Response Header indicated 111,628,288 bytes, but server sent 41 bytes
コンテンツの長さは正しく、それはファイル サイズですが、アプリが 41 バイトしか送信しなかった理由がわかりません。