How can I use Delphi to test if a Directory is writeable?

后端 未结 4 737
陌清茗
陌清茗 2020-12-01 15:20

Currently I use this function, based on JCL code, which works fine:

function IsDirectoryWriteable(const AName: string): Boolean;
var
  FileName: PWideChar;
          


        
4条回答
  •  粉色の甜心
    2020-12-01 15:26

    Actually writing to the directory is the simpliest way to determine if the directory is writable. There are too many security options available to check individually, and even then you might miss something.

    You also need to close the opened handle before calling DeleteFile(). Which you do not need to call anyway since you are using the FILE_FLAG_DELETE_ON_CLOSE flag.

    BTW, there is a small bug in your code. You are creating a temporary String and assigning it to a PWideChar, but the String goes out of scope, freeing the memory, before the PWideChar is actually used. Your FileName variable should be a String instead of a PWideChar. Do the type-cast when calling CreateFile(), not before.

    Try this:

    function IsDirectoryWriteable(const AName: string): Boolean; 
    var 
      FileName: String; 
      H: THandle; 
    begin 
      FileName := IncludeTrailingPathDelimiter(AName) + 'chk.tmp'; 
      H := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil, 
        CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE, 0); 
      Result := H <> INVALID_HANDLE_VALUE; 
      if Result then CloseHandle(H);
    end;
    

提交回复
热议问题