델파이와 시큐어 코딩에서 이어지는 글입니다.
지난번에 살펴본 소스에는 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.