![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление файла [D5, XP]
Не молодой © (2005-12-02 15:48:00)Подскажите, что нужно сделать, чтобы можно было удалитть временный файл
1.txtпосле
Var OutStream: TMemoryStream;
...
OutStream.SaveToFile('1.txt');
....
OutStream.Destroy;
...
AssignFile(Ft, '1.txt');
Reset(Ft);
CloseFile(Ft);
Erase(Ft);
....
Получаю ошибку ввода/вывода IO Error 32.
что еще необходимо освободить (файл занят)?
gdaujk (2005-12-03 16:23:00) [1]>Zeqfreed © (03.12.05 15:32) [8]
>Вместо Destroy лучше использовать Free.
Точно, а то вдруг один из стримов будет nil:-)
Не молодой (03.12.05 14:54) [5]
Следующий код у меня работает без сбоев:
procedure TForm1.Button2Click(Sender: TObject);
const
TempFile = '1.txt';
C = 1;
D =2;
var
InStream: TFileStream;
OutStream: TMemoryStream;
Xcurr, Ycurr, Xprev, Yprev, Aprev, Acurr, Bprev, Bcurr: Longword;
RC: Integer;
FileDeleted: Boolean;
begin
InStream := TFileStream.Create('0.txt', fmOpenRead);
OutStream := TMemoryStream.Create;
Repeat
InStream.ReadBuffer(Xcurr, SizeOf(Xcurr));
//!!!если размер файла '0.txt' не кратен SizeOf(Xcurr), то здесь вылетает ошибка!!!
Case RC of
1:Ycurr:= C;
2:Ycurr:= D;
end;
OutStream.WriteBuffer(Ycurr, SizeOf(Ycurr));
Xprev:= Xcurr; Yprev:= Ycurr; Aprev:= Acurr; Bprev:= Bcurr;
Until InStream.Position = InStream.Size;
OutStream.SaveToFile(TempFile); //(1)
OutStream.Destroy;
InStream.Destroy;
FileDeleted:= DeleteFile(TempFile); //(2) лучше заменить Bool на FileDeleted
end;
ВOutStream.SaveToFile(...)иDeleteFile(...)(строки, помеченные (1) и (2)) указывай одинаковый файл.
PS: обрати внимание на пометки...
Zeqfreed (2005-12-03 15:32:00) [2]Не молодой (03.12.05 14:54) [5]
Вместо Destroy лучше использовать Free.
Anatoly Podgoretsky (2005-12-03 15:30:00) [3]Не молодой (03.12.05 14:54) [5]
Видимо файл Stemp занят, ты его сначала закрой.
Не молодой (2005-12-03 14:58:00) [4]Case RC of
1:Ycurr:= Xcurr+C;
2:Ycurr:= Xcurr+D;
end;
Не молодой (2005-12-03 14:54:00) [5]gdaujk © (03.12.05 14:30) [4]
InStream := TFileStream.Create('0.txt', fmOpenRead);
OutStream := TMemoryStream.Create;
Repeat
InStream.ReadBuffer(Xcurr, SizeOf(Xcurr));
Case RC of
1:Ycurr:= C;
2:Ycurr:= D;
end;
OutStream.WriteBuffer(Ycurr, SizeOf(Ycurr));
Xprev:= Xcurr; Yprev:= Ycurr; Aprev:= Acurr; Bprev:= Bcurr;
Until InStream.Position = InStream.Size;
OutStream.SaveToFile('1.txt');
OutStream.Destroy;
InStream.Destroy;
Bool:= DeleteFile(Stemp);
Получаю Bopl:= False (да и файл на диске остается)
gdaujk (2005-12-03 14:30:00) [6]Не молодой (03.12.05 12:10) [3]
Приведи конкретный код. У меня ни в одной из ситуаций ошибки не выскакивает.
Как (чем) освободить файл после OutStream.SaveToFile('1.txt');
SaveToFile заключается в конечном счёте в вызове 3-х WinAPI-функций:
CreateFile (создание файла)
WriteFile (запись файла)
CloseHandle (закрытие файла)
т. е. файл в конечном итоге освобождается.
Не молодой (2005-12-03 12:10:00) [7]Спасибо, собственно, подходит и [1] и [2], только при [1] - возвращает False,
а при [2] - IO Error 32.
Как (чем) освободить файл послеOutStream.SaveToFile('1.txt');?
gdaujk (2005-12-03 01:14:00) [8]>Не молодой (02.12.05 15:48)
>Получаю ошибку ввода/вывода IO Error 32.
А я почему-то не получаю. Что у тебя вместо "..."? Зачем:
Reset(Ft);
CloseFile(Ft);
, если можно просто:
AssignFile(Ft, '1.txt');
Erase(Ft);
, а лучше [1].
>Tonich © (02.12.05 16:03) [1]
>модуль Sysutils
Можно и не SysUtils, а Windows.
Tonich (2005-12-02 16:03:00) [9]
DeleteFile()модуль Sysutils