【发布时间】:2011-04-05 16:23:33
【问题描述】:
目前我使用这个函数,基于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 库中可用?
【问题讨论】:
-
代码不适合你吗?你不喜欢这种方法吗?这确实是一种非常简单(最简单?)的目录写访问测试方法。虽然我从来没有在 Windows 安全方面做过很多工作,但我想另一种方法是使用
GetFileSecurity函数。 -
我从来都不喜欢这样的功能。根据目录是否可写,您将做什么?你为什么不试着去做,如果失败了就优雅地处理它。
-
我的意思是,实际上没有任何需要像这样的通用函数。相反,您应该尝试编写您需要的任何文件,如果出现问题,那么如果此函数返回 false,则执行您将执行的任何操作。例如,如果您需要写入的文件被另一个进程锁定了怎么办?这个函数不会捕获这样的东西。
-
@Luke:当创建文件失败时,记录有关环境的额外信息会很有用。部分原因可能是目标文件夹是否已找到且可写。另一部分可能是(我们在日志中经常做的事情)列出所有具有我们无法访问的文件的句柄的进程......所以这个函数确实有其自身的优点。此外,我们经常在写入失败后使用它来检测只读文件夹并尝试将其更改为可写文件夹,以便我们可以重试写入。是的,我们可以盲目地尝试使其可写,但我们的日志现在信息量更大。
-
@Luke:这是一个可能的场景。可以用作“便携式”的应用程序,即从可移动驱动器运行。我想做的第一件事是检查我是否可以编写更改的数据和配置。如果出于某种原因,我从 CD-ROM 或写保护的笔式驱动器运行,那么我会设置一个标志以防止任何写操作尝试,因为在这种情况下,它不是错误或引起关注.否则,用户可能会收到大量“拒绝访问”错误消息,并有理由感到恼火。
标签: windows delphi permissions directory