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
标志,因此您无需打电话。BTW,您的代码中有一个小错误。 您正在创建一个临时
String
并将其分配给一个PWideChar
,但是在实际使用
String
之前,PWideChar
远离范围,释放内存。 您的FileName
变量应为一个String
而不是PWideChar
。 打电话时进行类型铸造,而不是以前进行。
trone this:CreateFile()
我的版本是我的版本,它将尝试在目标目录中创建一个Uniquetemp文件:
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中写文件。)
C.F。,Http://www.ureader.com/msg/16591730.aspx (我还有其他参考文献,但是我是一个新用户,只能发布一个链接。只需跟上上面链接中给出的URL。)
您需要做的一切就是验证您对目录的访问权限。这是怎么回事:
对其他人发布的代码进行了小修改。该代码不处理文件已经存在的情况。
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;