아래 코드와 같은, 주어진 디렉토리 자체를 완전히 삭제하는 함수를 만들었습니다.
실제로 돌려보면 에러가 나는데,
아래처럼 3depth의 폴더구조가 있다면
c:\test0001\test0011\test0111
c:\test0001\test0011\test0112
c:\test0001\test0011\test0113
제일 하단 test0111~0113을 지우고 난후
2depth이 test0011을 지울려고 하면 에러가 납니다.
윈도우 탐색기로 살펴보면 이미 사라졌어야할 test0111~0113 폴더가 존재하지만
클릭하면 '존재하지 않는다'면서 에러가 납니다.
'새로고침'해도 잠시 있다가 약 5~10초가 지나야 사라집니다.
그렇다고 폴더 삭제때 마다 5~10초씩 기다릴 수도 없구요...
어떻게 해야 하는지요?
(진행상황을 보기 위해 Memo1이 추가되어 있습니다.)
<!--CodeS-->
function TForm1.DeleteDirSubAll( path : String):Boolean;
var
FileInfo : TSearchRec;
fPath : String;
begin
if path[Length(path)] = '/' then begin
fPath := Copy(path, 1, Length(path)-1);
end else begin
fPath := path;
end;
Memo1.Lines.Add('검색시작 : ' + fPath);
FindFirst( fPath + '\*.*', faAnyFile, FileInfo);
repeat
if (FileInfo.Name <> '.') and (FileInfo.Name <> '..') then begin
if (FileInfo.Attr and faDirectory) <> 0 then begin
Memo1.Lines.Add('폴더검색 : ' + fPath + '/' + FileInfo.Name);
if DeleteDirSubAll( fPath + '/' + FileInfo.Name) = False then begin
Result := False;
Memo1.Lines.Add('에러/하위폴더 삭제 : ' + fPath + '/' + FileInfo.Name);
Exit;
end;
end else begin
Memo1.Lines.Add('파일삭제 : ' + fPath + '/' + FileInfo.Name);
if DeleteFile(PChar(fPath + '/' + FileInfo.Name)) = False then begin
result := False;
Memo1.Lines.Add('에러/파일삭제 : ' + fPath + '/' + FileInfo.Name);
Exit;
end;
end;
end;
until ( FindNext(FileInfo) <> 0);
Memo1.Lines.Add('폴더삭제 : ' + fPath);
if RemoveDirectory( PChar(fPath)) = False then begin
result := False;
Memo1.Lines.Add('에러/폴더삭제 : ' + fPath);
Exit;
end;
result := True;
end;
<!--CodeE-->
(색 입히기가 잘못돼어서 '\'를 '/'로 수정했습니다.)
FindFirst한것을 닫는 부분이 빠져 있군요... 이것만 추가하시면 잘 될듯하네요...
<!--CodeS-->
......
until ( FindNext(FileInfo) <> 0);
FindClose(FileInfo); // 추가
Memo1.Lines.Add('폴더삭제 : ' + fPath);
......
<!--CodeE-->
^^ 항상 즐코하세요...