Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文件访问问题_C#_.net_Permissions - Fatal编程技术网

C# 文件访问问题

C# 文件访问问题,c#,.net,permissions,C#,.net,Permissions,在写入文件之前: using (StreamWriter outfile = new StreamWriter(filePath, false, System.Text.Encoding.UTF8)) { outfile.Write(content); } 我正在使用以下命令检查文件写入权限: public bool CheckIfAccessToFileIsGranted(string filePath) { try { n

在写入文件之前:

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。为什么?


关于

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

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

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

这里有一个链接,指向我在这个问题上写的一篇详细的博客文章


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

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

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

这里有一个链接,指向我在这个问题上写的一篇详细的博客文章


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

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

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


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

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

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

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

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