【问题标题】:Best way to check for write permissions on a binary file with Delphi使用 Delphi 检查二进制文件写入权限的最佳方法
【发布时间】: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() 的安全性,以及它是否会以任何方式修改文件?

【问题讨论】:

  • 您的函数除了返回TrueFalse 外,还可能引发异常;这不好。如果AssignFileReset 失败,我认为您不能致电CloseFile。但Reset 不应更改文件。无论如何,请随时停止使用旧版 Pascal I/O。
  • "如果 Reset(testFile) 失败,结果将不会设置为 True。"如果Reset 引发,则该函数确实不会返回True但它也不会返回False,因为它根本不会返回。你的fcn的用户需要处理所有三种情况:retTrue,retFalse和异常。这很糟糕。
  • 感谢@AndreasRejbrand!你说得对,我应该正确处理异常。您对“停止使用旧版 Pascal I/O”的替代方案有什么建议吗?
  • TFileStream,也许?
  • 通常像IsExistingBinaryFileWriteable 这样的函数甚至不应该被编写。如果您需要写入文件,请尝试写入。如果你不能给它写信,当它发生时处理它。毕竟,无论如何,您都需要处理这种情况。您不应该尝试抢占该故障模式。

标签: file delphi permissions


【解决方案1】:

您必须更改您的函数,因为它无法捕获 IO 错误

function IsExistingBinaryFileWriteable(const aName : String): Boolean;
var
  testFile: File;
begin
  Result := False;
  if not FileExists(aName) then Exit;
  AssignFile(testFile, aName);
  FileMode := fmOpenWrite;
  try
    Reset(testFile); // open
  except
    Exit(False);
  end;
  Result := True;
  CloseFile(testFile);
end;

但是,此功能不检查权限,这只是检查您是否可以在文件上写入。有什么区别,认为您有一个文件,您有权更改它但具有只读属性。此函数返回 False 而不是 True。

我更喜欢使用这个CheckFileAccess 函数。

为了检查写访问,你可以使用这个条件

CheckFileAccess(yourFileName, FILE_GENERIC_WRITE) = FILE_GENERIC_WRITE

【讨论】:

  • 感谢发布异常处理,与以前的 cmets 相比已更改但未更新。 CheckFileAccess 的链接似乎没有包含完整的示例,但我明白了。
猜你喜欢
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2021-09-08
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多