windows - 如何使用 Delphi 测试目录是否可写?

标签 windows delphi permissions directory

目前我使用这个函数,基于 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/

相关文章:

windows - Perl 中当前机器的主机名

windows - 为什么在 Windows 上使用 CMake 进行构建时会出现重复的符号链接(symbolic link)器错误?

Delphi - RichEdit Zoom 带代码

android-studio - AVC 被拒绝...... Kotlin android studio

c - 为什么 printf() 不将此整数输出为 float ?

c# - 真正的并行下载

delphi生成随机PIN码

delphi - 我的变量命名约定有名称吗?

shell - 基于 SSH key 限制访问

Android 未在 ionic 应用程序中请求权限