2

次のコードを使用してファイルをアップロードしています。

アップロードが成功した後、ファイルを削除しようとしていますが、32 - File in use エラーが発生します。

このファイル使用エラーを解決する方法を誰か教えてもらえますか? 次のコードはファイルをアップロードしていますが、完了しても解放していません..

var
  HTTP: TidHTTP;
  SSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
  PostData: TIdMultiPartFormDataStream;
  ResponseStream: TStringStream;
  Delete : Boolean;

begin
  ResponseStream := TStringStream.Create('');
  HTTP := TidHTTP.Create(nil);
  SSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

  try
    SSLIOHandler.SSLOptions.Method := sslvSSLv3;
    HTTP.ReadTimeout := 30000; //30 seconds
    HTTP.ConnectTimeout := 30000; //30 seconds
    HTTP.IOHandler := SSLIOHandler;
    HTTP.HTTPOptions := [hoKeepOrigProtocol];
    HTTP.ProtocolVersion := pv1_1;
    PostData := TIdMultiPartFormDataStream.Create;

    PostData.AddFormField('username', 'demo');
    PostData.AddFormField('password', 'demo');
    PostData.AddFormField('action', 'upload');
    PostData.AddFormField('accountno', 'demo');

  PostData.AddFile('uploadedfile', FileName, GetMIMETypeFromFile(FileName));

  HTTP.Request.ContentType := PostData.RequestContentType;
  HTTP.Post('http://uploadsite.com/ex/exampleAPI.asmx/Process', PostData, ResponseStream);

  if AnsiContainsStr(ResponseStream.DataString, 'Done') then
    Delete := True;

finally
  SSLIOHandler.Free;
  HTTP.Free;
  ResponseStream.Free;
end;

if Delete then
  if DeleteFile(BFlashFileName) then
    ShowMessage('Deleted')
  else ShowMessage(BFlashFileName+' not deleted, error = '+
               IntToStr(GetLastError));
4

1 に答える 1

5

ファイルを削除する前に、インスタンスのClearメソッドを呼び出してください。TIdMultiPartFormDataStreamもう必要ない場合は、解放することも同じことになります(つまりPostData.Free)。PostData現在、変数をリークしているようです。

TIdMultiPartFormDataStreamが Fields コレクションをクリアしている間、AddFileメソッドによって作成されたファイル ストリームは破棄され、ファイルのハンドルが閉じられます。

于 2012-06-08T23:35:06.683 に答える