目前我使用这个函数,基于 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;
我可以用这些标志改进什么吗? 是否可以在不实际创建文件的情况下完成测试? 或者此功能是否已经在 RTL 或 Jedi 库之一中可用?
最佳答案
实际上写入目录是确定目录是否可写的最简单方法。可供单独检查的安全选项太多,即使这样您也可能会遗漏一些东西。
您还需要在调用 DeleteFile()
之前关闭打开的句柄。因为您使用的是 FILE_FLAG_DELETE_ON_CLOSE
标志,所以您无论如何都不需要调用它。
顺便说一句,您的代码中有一个小错误。您正在创建一个临时 String
并将其分配给 PWideChar
,但是 String
超出范围,释放内存,然后 PWideChar
实际使用。您的 FileName
变量应该是 String
而不是 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;
关于windows - 如何使用 Delphi 测试目录是否可写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3599256/