2010-11-19 51 views
1

之前写入文件:文件访问问题

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

我检查文件写入accsses使用此:

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

尽管有上述功能的事实给予我的评价(返回true) ,我在打开流时遇到了UnauthorizedAccessException。为什么?

问候

回答

6

这里的问题是你使用文件系统权限混乱的代码访问安全(CAS)。前者是一种限制,仅适用于CLR流程,而后者则是操作系统级限制。这两种安全方法是相互独立的(尽管文件系统信息可以对CAS策略做出贡献)。

在这种情况下,UnauthorizedAcessException表示文件系统中缺少权限,但您试图用CAS检查来防止这种情况,这将不起作用。

在文件系统级别(不包括CAS),尝试验证操作的操作将会或不会成功执行,这实际上是徒劳的。根本没有办法做到这一点,因为有太多的外部实体可以在检查之间更改文件系统并尝试访问。只要尝试访问文件并捕获由于访问失败而导致的异常就更加可靠。

下面就来详细的博客文章中,我在这个问题上

+1

+1只为最后一句话... – 2010-11-19 18:19:29

4

写道只是不这样做的链接。尽管JaredPar对于这种情况不起作用的正确答案,但我想扩展他的最后一句话:整个练习是徒劳的。

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

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

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