File and Sub Directory Copy/Delete/Move, Rename Code.

볼랜드 포럼이였나 개인 블로그였나 기억이 나진 않는데 하위 디렉토리 포함 복사 코드라고 나와있는걸 아주 약간 수정을 본 코드다.

실제 이 코드는 복사뿐만 아니라 삭제, 이동도 가능하며, 이름 바꾸기도 가능하다.

 

Using 에 다음 라이브러리를 추가한다.

ShellApi

 

이 함수를 코드 상단에 선언한다.

Function File_DirOperations_Datail(
Action            : String;  {COPY, DELETE, MOVE, RENAME}
RenameOnCollision : Boolean; {Renames if directory exists}
NoConfirmation    : Boolean; {Responds “Yes to All” to any dialogs}
Silent            : Boolean; {No progress dialog is shown}
ShowProgress      : Boolean; {displays progress dialog but no file
names}
FromDir           : String;  {From directory}
ToDir             : String   {To directory}
): Boolean;

 

그리고 아래 함수를 소스 아무곳이나 맘에 드는 곳에 넣어둔다.

Function File_DirOperations_Datail(
Action            : String;  {COPY, DELETE, MOVE, RENAME}
RenameOnCollision : Boolean; {Renames if directory exists}
NoConfirmation    : Boolean; {Responds “Yes to All” to any dialogs}
Silent            : Boolean; {No progress dialog is shown}
ShowProgress      : Boolean; {displays progress dialog but no file
names}
FromDir           : String;  {From directory}
ToDir             : String   {To directory}
): Boolean;
var
SHFileOpStruct : TSHFileOpStruct;
FromBuf, ToBuf: Array [0..255] of Char;
begin
Try
Fillchar(SHFileOpStruct, Sizeof(SHFileOpStruct), 0 );
FillChar(FromBuf,        Sizeof(FromBuf),        0 );
FillChar(ToBuf,          Sizeof(ToBuf),          0 );
StrPCopy(FromBuf,        FromDir);
StrPCopy(ToBuf,          ToDir);
With SHFileOpStruct Do
Begin
Wnd    := 0;
If UpperCase(Action) = ‘COPY’   Then wFunc := FO_COPY;
If UpperCase(Action) = ‘DELETE’ Then wFunc := FO_DELETE;
If UpperCase(Action) = ‘MOVE’   Then wFunc := FO_MOVE;
If UpperCase(Action) = ‘RENAME’ Then wFunc := FO_RENAME;
pFrom  := @FromBuf;
pTo    := @ToBuf;
fFlags := FOF_ALLOWUNDO;
If RenameOnCollision Then fFlags := fFlags or FOF_RENAMEONCOLLISION;
If NoConfirmation    Then fFlags := fFlags or FOF_NOCONFIRMATION;
If Silent            Then fFlags := fFlags or FOF_SILENT;
If ShowProgress      Then fFlags := fFlags or FOF_SIMPLEPROGRESS;
End;
Result := (SHFileOperation(SHFileOpStruct) = 0);
Except
Result := False;
End;
end;

 

이 함수의 파라미터는 다음과 같다.

1. 문자형으로 복사인지 삭제인지 이동인지 이름 바꾸기인지 넣는다.

2. 만약 파일이 이미 존재할 경우 이름바꾸기를 할 것인지 결정한다.

3. 작업도중 같은 파일이 있거나, 읽기전용 파일을 삭제할꺼냐는 다이얼 로그가 뜨면 무조건 Yes 나 All 을 선택하는지 결정한다.

4. 작업 상황을 안보여주고 조용히 백그라운드에서 복사할 것인지 결정한다.

5. 프로그래스바(PrograssBar) 를 표시할 것인지 결정한다.

6. 원본 경로를 넣는다.

파일 전체 경로를 넣을 경우 하나의 파일만을 대상으로 할 것이고, 파일명 대신 *.* 이 들어가면 폴더내 전체 파일과 서브 디렉토리가 Source 가 된다. (Dos 에서 copy 명령의 경로 작성법과 같다고 보면 된다.)

7. 대상 경로를 넣는다.

파일명을 바꾼다면 바뀐 파일명이 들어가면 되겠다. 디렉토리 경로만 들어간다면 해당 디렉토리에 복사, 이동 등의 작업이 된다.

 

다이얼 로그는 우리가 탐색기에서 파일 복사를 할 때 나오는 다이얼 로그와 같다.

이 코드는 쉽고 간편하게 쓸 수 있다는 장점이 있다.