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

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

Что мешает удалению каталога? [D5, Win2k, WinXP]


Charly22 ©   (2004-09-13 19:37:00) 

Коллеги! Я тут совсем запутался. Помогите. Я создаю свой временный каталог MyTmpDir. Туда записываю несколько текстовых файлов с помощью AssignFile. В процессе работы программы эти файлы неоднократно читаются-записываются. По окончании работы программы все это дело должно удаляться. У меня получается так, что файлы внутри каталога удаляются, а пустой каталог остается. Этот пустой каталог удаляется вручную только после того, как программа закроется. Я понимаю, что надо "отпустить" этот каталог, но как? Ведь GetCurrentDir показывает каталог, где находится экзешник.
Вот код создания и удаления каталога в упрощенном варианте:


var MyTmpDir: String;
   MyTmpFile: TextFile;

begin
  MyTmpDir := 'c:\tmpDir';
  MkDir(MyTmpDir);
  AssignFile(myTmpFile, MyTmpDir + '\tmpfile.txt');
  Rewrite(myTmpFile);
  Writeln(myTmpFile,'blablablablabla');
  CloseFile(MyTmpFile);
  if NOT RemoveTmpDir(MyTmpDir) then ShoMessage('Could not remove directory!');  
// рекурсивная ф-ция для удаления каталога
// вместе со всем его содержимым
end;

function RemoveTmpDir(sDir : String) : Boolean;
var
  iIndex : Integer;
  SearchRec : TSearchRec;
  sFileName : String;
begin
  Result := False;
  sDir := sDir + '\*.*';
  iIndex := FindFirst(sDir, faAnyFile, SearchRec);

  while iIndex = 0 do
    begin
      sFileName := ExtractFileDir(sDir)+'\'+SearchRec.Name;
      if SearchRec.Attr = faDirectory then
        begin
          if (SearchRec.Name <> '' ) and
             (SearchRec.Name <> '.') and
             (SearchRec.Name <> '..') then RemoveTmpDir(sFileName);
        end else
        begin
          if SearchRec.Attr <> faArchive then
              FileSetAttr(sFileName, faArchive);
          if NOT DeleteFile(sFileName) then
              ShowMessage('Не удается удалить ' + sFileName + #10#13 + 'При необходимости Вы можете удалить его вручную.');
        end;
      iIndex := FindNext(SearchRec);
    end;

  FindClose(SearchRec);

  Result := RemoveDir(ExtractFileDir(sDir));
end;


Defunct   (2004-09-14 06:06:00) [1]

Charly22   (13.09.04 19:37)  

создавайте временные файлы во временном каталоге системы, в system evironment специально отведены переменные TEMP и TMP, чтобы программист не задумывался об удалении каталога. Там система позаботится об очистке даже в случае сбоя (например, свет пропал)

API - GetTempPath

PS: Не удаляться каталог может даже в таком тривиальном случае - пользователь открыл ваш каталог в проводнике. Не стоит создавать мусор, да еще и в корне диска C:.


Charly22   (2004-09-13 21:32:00) [2]

И еще одна такая странность. В тот каталог у меня иногда записывались файлы вот таким образом:

fName := fName := MyTmpDir + '\SavedData\filename.bmp';
MyImage.Picture.SaveToFile(fName);

При таком сохранении файла все удаляется подчистую: и файлы, и вложенный каталог, и сам каталог MyTmpDir.
Надо отметить, что в данном случае не создавались текстовые файлы, как это было показано выше в моем первом посте.


Palladin   (2004-09-13 20:32:00) [3]

Точно
sDir := sDir + '\*.*';
проглядел...

тогда анализируй IOResult...


Anatoly Podgoretsky   (2004-09-13 20:19:00) [4]

Palladin ©   (13.09.04 19:48) [2]
Не становится


Palladin   (2004-09-13 20:13:00) [5]

AssignFile(myTmpFile, MyTmpDir + '\tmpfile.txt');
файл - c:\tmpDir\tmpfile.txt

удаление при sDir='c:\tmpDir'
sFileName := ExtractFileDir(sDir)+'\'+SearchRec.Name = 'c:\\tmpfile.txt';


ЮрийК   (2004-09-13 20:10:00) [6]

Palladin,
Кто-то ошибся, автор или вы?
Ещё раз проверьте код, я его внимательно не изучал, я по сути вопроса попытался ответить.


Palladin   (2004-09-13 20:04:00) [7]


>  ЮрийК ©   (13.09.04 19:58)

дело не в двух слэшах... файлы то создаются не в корне а в tmpDir...


ЮрийК   (2004-09-13 19:58:00) [8]

Если два слэша, то предусмотрено наверное, что это возможная ошибка, и просто принимается системой за один слэш.
У меня тоже подобное случается, файлы удаляются, директория нет.
В чём дело, непонятно.


Palladin   (2004-09-13 19:48:00) [9]

Очень интересно... по идее у тебя и файлы удалятся не должны, что то ты не договариваешь...

при MyTmpDir:='c:\tmpDir';

sFileName := ExtractFileDir(sDir)+'\'+SearchRec.Name;

sFileName становится 'c:\\'+SearchRec.Name
и как он удалится...

кстати для чего перед удалением утанавливать faArchive? непонятно...


Alx2   (2004-09-13 19:41:00) [10]

Попробуй RemoveDirectory - в случае ошибки можно ее диагностировать с помощью GetLastError.

ps
также GetCurrentDirectory ничего подозрительного не показывает?


Наверх

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