Файл все еще используется Ошибка 32 Как его освободить?

Я загружаю файл с помощью следующего кода.

После успешной загрузки я пытаюсь удалить файл, но получаю сообщение об ошибке 32 — «Файл используется».

Может ли кто-нибудь сказать мне, как я могу решить эту ошибку использования файла? Следующий код загружает файл, но не выпускает его после завершения.

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

person Trevor    schedule 08.06.2012    source источник


Ответы (1)


Вызовите метод Clear вашего экземпляра TIdMultiPartFormDataStream перед попыткой удалить файл. Если он вам больше не нужен, его освобождение также будет означать то же самое (т.е. PostData.Free). В настоящее время похоже, что вы пропускаете свою переменную PostData.

Пока TIdMultiPartFormDataStream очищает свою коллекцию Fields, файловый поток, созданный методом AddFile, будет уничтожен, закрыв дескриптор файла.

person Sertac Akyuz    schedule 08.06.2012