[델파이와 시큐어 코딩] 안전한 디렉토리 제거 방법

델파이와 시큐어 코딩에서 이어지는 글입니다.

지난번에 살펴본 소스에는 StrPCpy가 들어가서 문제가 있었다.
그렇다면 StrPCpy를 뺀 소스가 있을까? 당연하다. 사실 해당 부분은 없어도 되는 부분이다.

다음은 해당 소스이다. 함수를 쪼갠 이유는 수정시 편의를 위해서이니 만약 불편하다면 합쳐서 써도 상관없다.

unit uDeleteDirectory;

interface

uses SysUtils, ShellAPI;

function DeleteDirectory(const DirectoryToDelete: String): Boolean;

implementation

function GetSHFileOpStruct(const DirectoryToDelete: String): TSHFileOpStruct;
begin
  FillChar(result, sizeof(SHFileOpStruct), 0);
  result.Wnd := 0;
  result.pFrom := PChar(DirectoryToDelete);
  result.wFunc := FO_DELETE;
  result.fFlags := result.fFlags or FOF_NOCONFIRMATION;
  result.fFlags := result.fFlags or FOF_SILENT;
end;
    
function TryToDeleteFoundDirectory(const DirectoryToDelete,
  FoundFile: String): Boolean;
var
  CurrentDirectoryToDelete: String;
begin
  CurrentDirectoryToDelete := ExcludeTrailingPathDelimiter(
    DirectoryToDelete + FoundFile);
  result := (SHFileOperation(GetSHFileOpStruct(
    CurrentDirectoryToDelete)) = 0);
end;

function DeleteDirectory(const DirectoryToDelete: String): Boolean;
var
  ZeroFoundElseNotFound: integer;
  SearchRecord: TSearchRec;
begin
  result := false;
  ZeroFoundElseNotFound := FindFirst(DirectoryToDelete + '*.*', faAnyFile,
    SearchRecord);
    
  while ZeroFoundElseNotFound = 0 do
  begin
    TryToDeleteFoundDirectory(DirectoryToDelete, SearchRecord.Name);
    ZeroFoundElseNotFound := FindNext(SearchRecord);
  end;
  
  FindClose(SearchRecord);
end;

end.

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.