Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.06 c
14-1094237837
Soft
2004-09-03 22:57
2004.09.26
Microsoft запантетовала человеческое тело.


3-1093429310
starling13
2004-08-25 14:21
2004.09.26
Запись произвольного файла в поле BLOB Firebird


4-1092402037
Shuma
2004-08-13 17:00
2004.09.26
Проблемы с DLL


1-1094715587
~ShamaN~
2004-09-09 11:39
2004.09.26
вопрос по работе со строками


1-1094629327
Black
2004-09-08 11:42
2004.09.26
массив типа TForm





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский