Q&A

  • 폴더 삭제시 임의의 하위디렉토리까지 삭제하는 방법 좀 가르쳐주세요
안녕하세요.
제가 지금 폴더 한 두어개를 모든 작업이 끝난다음에 삭제하여야 하거든요.
검색을 해보니 어느 특정 폴더의 그 안의 파일을 모두 삭제한 다음에 RemoveDirectory를 이용하여 지울 수가 있더군요.
근데 문제는 지워야 하는 폴더 밑에 하위 디렉토리가 존재할 경우는 지울 수가 없다는 거지요.
좀 더 생각을 해보니 맨 아래 디렉토리부터 찾아서 그 파일들을 삭제하는 방식으로 해서 하면 (완전히 노가다라고 생각해서) 지울 수는 있을 것 같더라구요.
이런 방법밖에 없을까요?
좀 더 획기적인 방법이 있지 않을까해서 질문드립니다.
읽어주셔서 감사합니다. 좋은 방법이 있으면 가르쳐주실 수 없을까요?
우선 폴더하나를 삭제하는 소스를 올려봅니다.
날씨 더운데 수고하십시요.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
private
   { Private declarations }
public
   { Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
DirInfo: TSearchRec;
r : Integer;

begin
r := FindFirst('C:\temp\*.*', FaAnyfile, DirInfo);
While r = 0 do
   begin
     if ((DirInfo.Attr and FaDirectory <> FaDirectory) and
           (DirInfo.Attr and FaVolumeId <> FaVolumeID)) then
       if DeleteFile(pChar('C:\temp\' + DirInfo.Name)) = false then
         ShowMessage('삭제할 수 없는 파일 : C:\temp\' + DirInfo.Name);
     r := FindNext(DirInfo);
   end;
SysUtils.FindClose(DirInfo); // FindFirst에 의해 사용된 메모리를 해제
RemoveDirectory(PChar('C:\Temp'));
end;

end.

P.S : 혹시 ShellAPI로 도스 명령어처럼 명령을 주는 방법은 없을까요?
     창피하지만 제가 아직 ShellAPI 많은 경험이 없어서요... 답변 부탁드리겠습니다.
2  COMMENTS
  • Profile
    너구리 2004.06.03 01:42
    function ThMakePDF.ExecFileAndWait(const aCmdLine: String; Hidden, doWait: Boolean): Boolean;
    var
      StartupInfo : TStartupInfo;
      ProcessInfo : TProcessInformation;
    begin

      FillChar(StartupInfo, SizeOf(TStartupInfo), 0);

      with StartupInfo do
       begin
        cb:= SizeOf(TStartupInfo);
        dwFlags:= STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
        if Hidden
         then wShowWindow:= SW_HIDE
         else wShowWindow:= SW_SHOWNORMAL;
       end;

       Result := CreateProcess(nil,PChar(aCmdLine), nil, nil, False,
       NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo);
       if doWait then
         if Result then
         begin
           WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
           WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
         end;
    end;

    이건 제가 전에 델마당에서 찾아서 썼던거구요 쓰레드 안에서도
    아주 잘됩니다.아차 외부 프로그램 실행하고 기다리는 겁니다.
    필요 하실거 같아서요..

    그리고..

    WinExec(PChar('cmd /c echo not enough parameter'),SW_SHOWNORMAL);

    WinExec(PChar('cmd /c Exit'),SW_SHOWNORMAL);

    이건 제가 오라클 덤프할려고 만든 콘솔 프로그램에서
  • Profile
    나기 2004.06.03 08:07
    WinExec 함수를 쓰시면 됩니당..
    사용하고 계시는 운영체제가
    윈NT~XP계열이면..
      WinExec('cmd /c rmdir/s/q c:\temp', SW_SHOW);
    윈95~Me계열이면..
      WinExec('command.com /c rmdir/s/q c:\temp', SW_SHOW);