我如何使用Delphi测试目录是否可以写入?

问题描述 投票:0回答:4
目前,我基于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 delphi permissions directory
4个回答
20
投票
您还需要在致电

DeleteFile()

之前关闭打开的手柄。 由于您使用的是

FILE_FLAG_DELETE_ON_CLOSE

标志,因此您无需打电话。

BTW,您的代码中有一个小错误。 您正在创建一个临时
String
并将其分配给一个

PWideChar

,但是在实际使用

String
之前,
PWideChar
远离范围,释放内存。 您的
FileName
变量应为一个
String
而不是
PWideChar
。 打电话时进行类型铸造,而不是以前进行。 trone this:
CreateFile()
    
我的版本是我的版本,它将尝试在目标目录中创建一个
Unique

temp文件:

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;
    

5
投票
andreas ...

使用安全性API获得文件/目录的有效权利是PIA混乱,只是不可靠。 (我将所有代码丢弃了这样做,以便仅检查是否可以在dir中写文件。)

C.F。,
Http://www.ureader.com/msg/16591730.aspx (我还有其他参考文献,但是我是一个新用户,只能发布一个链接。只需跟上上面链接中给出的URL。)

您需要做的一切就是验证您对目录的访问权限。这是怎么回事:

2
投票

对其他人发布的代码进行了小修改。该代码不处理文件已经存在的情况。

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;


1
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.