Файлът все още се използва Грешка 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