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

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

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

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

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

Сообщение VirtUX »

Не могу внутри Destroy удалить файл. Хочу чтоб при разрушении объекта удалялся (созданный в конструкторе) файл. Чтоб мусор не оставался. Но что-то у меня он не удаляется... :(
Делаю так:

Код: Выделить всё

destructor TFP_Server.Destroy;
begin
  ...
  if FileExists(FTunnel) then DeleteFile(FTunnel);
  ...
  inherited Destroy;
end;   
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Возможно Destroy не вызывается. Проверьте.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Возможно, стоит попробовать DeleteFileUTF8?
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

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

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

Вряд-ли. Т.к. в других участках кода DeleteFile удаляет этот туннель!
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Файл может не удаляться, если его открыл кто-то другой. Какую-то информацию может дать значение errno (linux) или GetLastError (windows) сразу после DeleteFile.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

: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
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Файл никем не трогается, кроме самой проги, что его создала. Он ваще никогда и никем не открывается! Это что-то типа флага.

Код: Выделить всё

 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;           

Теперь все удаляется отличненько! :)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

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

Сообщение VirtUX »

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

Именно. Никогда раньше не юзал FileCreate. Почему-то показалось, что она просто создает файл, а открывать нужно чем-то типа FileOpen...
Ответить