Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление файла [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо