【发布时间】:2021-09-02 23:50:24
【问题描述】:
我需要一种方法来确定用户是否可以写入二进制文件。
用户可能没有对目录及其内容的写权限。但是,他们可以创建新文件并对其进行修改 - 因此通过在目录中创建新文件进行测试是不准确的。
以下似乎可以解决问题,这是最好的方法吗,是否安全?
function IsExistingBinaryFileWriteable(const aName : String): Boolean;
var
testFile: File;
begin
Result := False;
if not FileExists(aName) then Exit;
try
AssignFile(testFile, aName);
FileMode := fmOpenWrite;
Reset(testFile); // open
Result := True;
finally
CloseFile(testFile);
end;
end;
如果 Reset(testFile) 失败,结果将不会设置为 True。 对我来说似乎测试没问题,我只是担心像这样使用 Reset() 的安全性,以及它是否会以任何方式修改文件?
【问题讨论】:
-
您的函数除了返回
True或False外,还可能引发异常;这不好。如果AssignFile或Reset失败,我认为您不能致电CloseFile。但Reset不应更改文件。无论如何,请随时停止使用旧版 Pascal I/O。 -
"如果 Reset(testFile) 失败,结果将不会设置为 True。"如果
Reset引发,则该函数确实不会返回True。 但它也不会返回False,因为它根本不会返回。你的fcn的用户需要处理所有三种情况:retTrue,retFalse和异常。这很糟糕。 -
感谢@AndreasRejbrand!你说得对,我应该正确处理异常。您对“停止使用旧版 Pascal I/O”的替代方案有什么建议吗?
-
TFileStream,也许? -
通常像
IsExistingBinaryFileWriteable这样的函数甚至不应该被编写。如果您需要写入文件,请尝试写入。如果你不能给它写信,当它发生时处理它。毕竟,无论如何,您都需要处理这种情况。您不应该尝试抢占该故障模式。
标签: file delphi permissions