如何使用Delphi来testing目录是否可写?

目前我使用这个function,基于JCL代码,它工作正常:

function IsDirectoryWriteable(const AName: string): Boolean; var FileName: PWideChar; H: THandle; begin FileName := PWideChar(IncludeTrailingPathDelimiter(AName) + 'chk.tmp'); H := CreateFile(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; DeleteFile(FileName); end; 

有什么我可以改善旗帜? testing可以在不创build文件的情况下完成吗? 或者,这个function甚至已经在RTL或Jedi库之一中可用?

Solutions Collecting From Web of "如何使用Delphi来testing目录是否可写?"

实际上写入目录是确定目录是否可写的最简单的方法。 有太多的安全选项单独检查,即使这样你可能会错过一些东西。

在调用DeleteFile()之前,还需要关闭打开的句柄。 因为您正在使用FILE_FLAG_DELETE_ON_CLOSE标志,所以您无需执行任何操作。

顺便说一句,你的代码中有一个小错误。 您正在创建一个临时String并将其分配给一个PWideChar,但是在实际使用PWideChar之前,该String超出了范围,释放了内存。 你的FileName变量应该是一个字符串而不是一个PWideChar。 调用CreateFile()时进行类型转换,而不是之前。

尝试这个:

 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; 

安德烈亚斯…

使用安全API来获得文件/目录的有效权限是PIA混乱,只是不可靠。 (我倾倒了我的所有代码,只是为了检查是否可以在dir中写入文件。)

cf, http: //www.ureader.com/msg/16591730.aspx

(我有其他的参考资料,但我是一个新用户,只能发布一个链接,只需按照上面链接中给出的URL)。

这里是我的版本使用GetTempFileName将尝试在目标目录中创建一个唯一的临时文件:

 function IsDirecoryWriteable(const AName: string): Boolean; var TempFileName: array[0..MAX_PATH] of Char; begin { attempt to create a temp file in the directory } Result := GetTempFileName(PChar(AName), '$', 0, TempFileName) <> 0; if Result then { clean up } Result := DeleteFile(TempFileName); end; 

当然,你所要做的就是验证你对电话号码簿的访问权限。 这有什么问题:

 function IsDirectoryWriteable(aName : String); var FileObject : TJwSecureFileObject; DesiredAccess: ACCESS_MASK; begin DesiredAccess := FILE_GENERIC_WRITE; FileObject := TJwSecureFileObject.Create(aName); try result := FileObject.AccessCheck(DesiredAccess); finally FileObject.Free; end; end;