![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что мешает удалению каталога? [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 ничего подозрительного не показывает?