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),尝试验证操作是否会成功的做法实际上是徒劳的。根本无法正确执行此操作,因为有太多外部实体可以在检查和尝试访问之间更改文件系统。只要尝试访问该文件并捕获由于访问失败而导致的异常,就更可靠了
这里有一个链接,指向我在这个问题上写的一篇详细的博客文章
UnauthorizedAcessException
表示文件系统中缺少权限,但您试图用CAS检查来保护它,这将不起作用
在文件系统级别(不包括CAS),尝试验证操作是否会成功的做法实际上是徒劳的。根本无法正确执行此操作,因为有太多外部实体可以在检查和尝试访问之间更改文件系统。只要尝试访问该文件并捕获由于访问失败而导致的异常,就更可靠了
这里有一个链接,指向我在这个问题上写的一篇详细的博客文章
- 不要这样做。虽然JaredPar对为什么它在这种情况下不起作用有正确的答案,但我想进一步阐述他的最后一句话:整个练习都是徒劳的
文件系统权限不稳定。它们可以以完全独立于应用程序代码的方式随时更改,这包括检查权限和尝试写入文件之间的时间。虽然权限不会经常更改,但在这个关键时期,文件甚至可能被删除或重命名
关键是,虽然很小,但在这个小窗口中发生某些事情的可能性很高,因此您需要花时间为此代码构建一个好的异常处理程序。一旦你完成了这项工作,你所做的所有检查文件权限的工作突然变得毫无意义
换句话说,查看您是否有写入文件的权限的正确方法是实际尝试写入文件。不要这样做。虽然JaredPar对为什么它在这种情况下不起作用有正确的答案,但我想进一步阐述他的最后一句话:整个练习都是徒劳的 文件系统权限不稳定。它们可以以完全独立于应用程序代码的方式随时更改,这包括检查权限和尝试写入文件之间的时间。虽然权限不会经常更改,但在这个关键时期,文件甚至可能被删除或重命名 关键是,虽然很小,但在这个小窗口中发生某些事情的可能性很高,因此您需要花时间为此代码构建一个好的异常处理程序。一旦你完成了这项工作,你所做的所有检查文件权限的工作突然变得毫无意义 换句话说,查看您是否有写入文件的权限的正确方法是实际尝试写入文件