Внутри Destroy удалить файл...

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Внутри Destroy удалить файл...

Сообщение VirtUX » 21.05.2011 18:51:33

Не могу внутри Destroy удалить файл. Хочу чтоб при разрушении объекта удалялся (созданный в конструкторе) файл. Чтоб мусор не оставался. Но что-то у меня он не удаляется... :(
Делаю так:
Код: Выделить всё
destructor TFP_Server.Destroy;
begin
  ...
  if FileExists(FTunnel) then DeleteFile(FTunnel);
  ...
  inherited Destroy;
end;   
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Внутри Destroy удалить файл...

Сообщение Mr.Smart » 21.05.2011 19:08:23

Возможно Destroy не вызывается. Проверьте.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Внутри Destroy удалить файл...

Сообщение Nik » 21.05.2011 20:59:33

Возможно, стоит попробовать DeleteFileUTF8?
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Внутри Destroy удалить файл...

Сообщение VirtUX » 22.05.2011 00:12:15

Mr.Smart писал(а):Возможно Destroy не вызывается. Проверьте.

Вызывается. Т.к. проверял через ShowMessage внутри Destroy.
Nik писал(а):Возможно, стоит попробовать DeleteFileUTF8?

Вряд-ли. Т.к. в других участках кода DeleteFile удаляет этот туннель!
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Внутри Destroy удалить файл...

Сообщение Sergei I. Gorelkin » 22.05.2011 01:09:24

Файл может не удаляться, если его открыл кто-то другой. Какую-то информацию может дать значение errno (linux) или GetLastError (windows) сразу после DeleteFile.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Внутри Destroy удалить файл...

Сообщение скалогрыз » 22.05.2011 10:25:53

:mrgreen: :mrgreen: :mrgreen:
Код: Выделить всё
if FileExists(FTunnel) then
while not DeleteFile(FTunnel) do
  sleep(100);

:mrgreen: :mrgreen: :mrgreen:

кстати, FileExists true возвращает?

в коде деструктора может быть такая логика заложена?
Код: Выделить всё
destructor TFP_Server.Destroy;
begin
  ...
  fTunnel:='';
  ...
  if FileExists(FTunnel) then begin
    ShowMessage('to delete '+fTunnel);
    DeleteFile(FTunnel);
  end;
  ...
  inherited Destroy;
end;


З.Ы. проблема очевидна в раздельном доступе к файлу, ибо fTunnel
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Внутри Destroy удалить файл...

Сообщение VirtUX » 23.05.2011 09:43:39

Файл никем не трогается, кроме самой проги, что его создала. Он ваще никогда и никем не открывается! Это что-то типа флага.
Код: Выделить всё
if FileExists(FTunnel) then begin
    ShowMessage(FTunnel);
    DeleteFile(FTunnel);
  end;

Месадж показывает именно тот файл, который нужно удалить! В принципе поле FTunnel в ходе работы программы свое значение не меняет. Однажды созданный файл неизменен до разрушения класса!
Код: Выделить всё
while FileExists(FTunnel) do DeleteFile(FTunnel);

Такая конструкция приводит к бесконечному циклу!
Sergei I. Gorelkin писал(а):Файл может не удаляться, если его открыл кто-то другой. Какую-то информацию может дать значение errno (linux) или GetLastError (windows) сразу после DeleteFile.

= 32 (Windows)

Добавлено спустя 16 минут 28 секунд:
Проблема решилась отказом от функции FileCreate из модуля SysUtils в пользу конструкции:
Код: Выделить всё
function FileCreateWithAssign(F: string): boolean;
var
  ff: file;
begin
  AssignFile(ff, F);
  Rewrite(ff);
  CloseFile(ff);
  Result := FileExists(F);
end;           

Теперь все удаляется отличненько! :)
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Внутри Destroy удалить файл...

Сообщение Sergei I. Gorelkin » 23.05.2011 11:35:14

FileCreate не только создает файл, но и открывает его с исключительным доступом. Поэтому, если после нее нет FileClose, то все вполне объяснимо.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Внутри Destroy удалить файл...

Сообщение VirtUX » 24.05.2011 09:29:18

Sergei I. Gorelkin писал(а):Поэтому, если после нее нет FileClose, то все вполне объяснимо.

Именно. Никогда раньше не юзал FileCreate. Почему-то показалось, что она просто создает файл, а открывать нужно чем-то типа FileOpen...
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru