Q&A

  • RemoveDirectory한 파일이 바로 지워지지 않아서 에러가 납니다.
아래 코드와 같은, 주어진 디렉토리 자체를 완전히 삭제하는 함수를 만들었습니다.

실제로 돌려보면 에러가 나는데,
아래처럼 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-->
(색 입히기가 잘못돼어서 '\'를 '/'로 수정했습니다.)
2  COMMENTS
  • Profile
    최용일 2007.11.01 19:40
    안녕하세요. 최용일입니다.

    FindFirst한것을 닫는 부분이 빠져 있군요... 이것만 추가하시면 잘 될듯하네요...

    <!--CodeS-->
      ......
      until ( FindNext(FileInfo) <> 0);
      FindClose(FileInfo); // 추가

      Memo1.Lines.Add('폴더삭제 : ' + fPath);
      ......
    <!--CodeE-->

    ^^ 항상 즐코하세요...

  • Profile
    송 시중 2007.11.01 22:27
    제가 기초적인 실수를 했군요 ^^;;