文件访问问题

时间:2010-11-19 17:59:28

标签: c# .net permissions

在写入文件之前:

using (StreamWriter outfile = new StreamWriter(filePath, false, System.Text.Encoding.UTF8))
{
    outfile.Write(content);            
}

我正在使用以下方法检查文件写入:

public bool CheckIfAccessToFileIsGranted(string filePath)
{
     try
     {
        new FileIOPermission(FileIOPermissionAccess.Write, filePath).Demand();
        return true;
     }
     catch (SecurityException)
     {
        return false;
     }
}

尽管上面的函数授予我评估(返回true),但是在打开流时我收到了UnauthorizedAccessException。为什么?

此致

2 个答案:

答案 0 :(得分:6)

这里的问题是您将代码访问安全性(CAS)与文件系统权限混淆。前者是仅适用于CLR进程的限制,而后者是操作系统级别限制。这两种安全方法彼此独立(尽管文件系统信息可以促成CAS策略)。

在这种情况下,UnauthorizedAcessException表示文件系统中缺少权限,但您尝试使用CAS检查来保护它,这将无效。

在文件系统级别(不包括CAS),尝试验证操作的操作将会或者不会成功,实际上是徒劳的。没有办法正确地执行此操作,因为许多外部实体可以在检查和尝试访问之间更改文件系统。只是尝试访问文件并捕获因访问失败而导致的异常,这样更可靠。

这是我在此问题上撰写的详细博文的链接

答案 1 :(得分:4)

不要这样做。虽然JaredPar对于为什么它不能在这种情况下工作有正确的答案,但我想扩展他的最后一句话:整个练习都是徒劳的。

文件系统权限是 volatile 。它们可以以完全独立于应用程序代码的方式从一个时刻改变到另一个时刻,这包括检查权限和尝试写入文件之间的时刻。虽然权限不会经常改变,但在这个关键时期甚至可以删除或重命名文件。

关键是,虽然很小,但在这个小窗口期间发生的事情的可能性很高,你需要花时间为这段代码构建一个好的异常处理程序。一旦你完成了这一切,所有这些工作你都经过检查,文件权限突然变得毫无意义。

换句话说,查看您是否有权写入文件的正确方法是实际尝试写入该文件。