Форум: "Основная";
Текущий архив: 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.037 c