Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Что мешает удалению каталога?   Найти похожие ветки 

 
Charly22   (2004-09-13 19:37) [0]

Коллеги! Я тут совсем запутался. Помогите. Я создаю свой временный каталог 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;



 
Alx2 ©   (2004-09-13 19:41) [1]

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

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


 
Palladin ©   (2004-09-13 19:48) [2]

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

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

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

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

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


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

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


 
Palladin ©   (2004-09-13 20:04) [4]


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

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


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

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


 
Palladin ©   (2004-09-13 20:13) [6]

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

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


 
Anatoly Podgoretsky ©   (2004-09-13 20:19) [7]

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


 
Palladin ©   (2004-09-13 20:32) [8]

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

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


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

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

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

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


 
Defunct ©   (2004-09-14 06:06) [10]

Charly22   (13.09.04 19:37)  

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

API - GetTempPath

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



Страницы: 1 вся ветка

Текущий архив: 2004.09.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
4-1092411169
TeNY
2004-08-13 19:32
2004.09.26
SPTI где можно достать компонент или заголовочный файл


3-1093606871
Aleksandr.
2004-08-27 15:41
2004.09.26
Как совместить сессию и TDataBase потока с bdeAPI?


1-1094717450
prorok2
2004-09-09 12:10
2004.09.26
CheckListBox и перерисовка


1-1094634938
rand0m
2004-09-08 13:15
2004.09.26
Run-time библиотеки Delphi


14-1094627041
Drakosha
2004-09-08 11:04
2004.09.26
Батька супер джинс - сроки действия больше не действуют :(