代码之家  ›  专栏  ›  技术社区  ›  jwaliszko

文件访问问题

  •  1
  • jwaliszko  · 技术社区  · 14 年前

    在写入文件之前:

    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 回复  |  直到 14 年前
        1
  •  6
  •   JaredPar    14 年前

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

    在这种情况下 UnauthorizedAcessException 表示文件系统中缺少权限,但您正试图用无法工作的CAS检查来保护它。

    在文件系统级别(不包括CAS),在hand之前尝试验证操作是否会成功的做法实际上是徒劳的。根本无法正确执行此操作,因为这么多外部实体可以在检查和尝试访问之间更改文件系统。更可靠的做法是尝试访问文件并捕获由于访问失败而导致的异常。

    这是我在这个问题上写的一篇详细的博客文章的链接

        2
  •  4
  •   Joel Coehoorn    14 年前

    别这么做。虽然JaredPar对于为什么在这种情况下不起作用有正确的答案,但我想进一步解释他的最后一句话:整个练习都是徒劳的。

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

    关键是,虽然很小,但在那个小窗口中发生某些事情的可能性很高,您需要花时间来构建 好的 此代码的异常处理程序。一旦你这样做了,所有这些工作,你通过检查文件权限突然变得没有意义。

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