C# 未经授权的访问(例外) { 如果(尝试
以下是您正在寻找的解决方案C# 未经授权的访问(例外) { 如果(尝试,c#,.net,file-access,C#,.net,File Access,以下是您正在寻找的解决方案 var fileIOPermission=new fileIOPermission(FileIOPermissionAccess.Read, System.Security.AccessControl.AccessControlActions.View, MyPath); if(fileIOPermission.AllFiles==FileIOPermissionAccess.Read) { //在这里做你的事。。。 } 这将基于所有文件路径的视图创建一个新的读取权
var fileIOPermission=new fileIOPermission(FileIOPermissionAccess.Read,
System.Security.AccessControl.AccessControlActions.View,
MyPath);
if(fileIOPermission.AllFiles==FileIOPermissionAccess.Read)
{
//在这里做你的事。。。
}
这将基于所有文件路径的视图创建一个新的读取权限,然后检查它是否等于文件访问读取权限。当我更改标记时的说明:“我正在更正”。没有笑话。同意-我希望有一个TryOpen(即尝试解析模式)。没错。这是竞争条件的典型示例。korro:无论如何,您都必须能够处理失败时的错误权限,这使得初始检查变得多余和浪费。初始检查有助于优雅地处理常见的特定错误-向前看通常比将特定异常属性与特定原因匹配更容易是的。try/catch仍然是强制性的。此答案不回答“如何检查我是否有权打开文件”的问题在尝试打开文件之前,在某些情况下。情况很可能是,如果在该情况下不允许权限,则软件将不会尝试读取该文件,即使在检查权限后很可能会授予权限。权限是否易变并不重要,因为您只关心该实例中的权限是什么ant.失败应该总是被处理的,但是如果你检查了一个读取权限,但它不在那里,那么你可能想跳过读取文件,即使可能在一秒钟后你就可以访问。你必须在某个地方划清界限。@Ash我想你没有正确地阅读这个问题,他想避免尝试捕获。@Ravisha,你读过Joel吗如Joel所说,“您所做的只是尝试打开文件,并在异常失败时处理异常。”。请不要因为您不喜欢某些事情无法避免的事实而否决投票。感谢您的代码!有一件事,最好使用using,例如,如果您返回文件流,则调用方必须使用
using
,尽管…@Cel-using
在这里不起作用。在using块的末尾,fs
将被强制关闭。您将给调用方一个关闭的(如此无用的)文件流!-1:使用“throw”;而不是“throw unauthorizedAccessException;”。您正在丢失堆栈跟踪。为什么尝试次数
由ref传递?这没有任何意义。的测试也没有任何意义。约翰:在这种情况下,最好丢失(深度嵌套)递归调用的堆栈跟踪,因此我认为在本例中,throw-ex
实际上是正确的做法。@Konrad:@Rudzitis:我正在更改-1的原因。这比用“throw-ex”扭曲堆栈更糟糕。在堆栈深度非常重要的时候,通过递归人为地诱导额外的堆栈级别,这是一个迭代问题,而不是递归问题。不适用于我拥有权限的任何文件
public static bool IsFileLocked(string filename)
{
bool Locked = false;
try
{
FileStream fs =
File.Open(filename, FileMode.OpenOrCreate,
FileAccess.ReadWrite, FileShare.None);
fs.Close();
}
catch (IOException ex)
{
Locked = true;
}
return Locked;
}
public static FileStream GetFileStream(String filePath, FileMode fileMode, FileAccess fileAccess, FileShare fileShare, ref int attempts, int attemptWaitInMilliseconds)
{
try
{
return File.Open(filePath, fileMode, fileAccess, fileShare);
}
catch (UnauthorizedAccessException unauthorizedAccessException)
{
if (attempts <= 0)
{
throw unauthorizedAccessException;
}
else
{
Thread.Sleep(attemptWaitInMilliseconds);
attempts--;
return GetFileStream(filePath, fileMode, fileAccess, fileShare, ref attempts, attemptWaitInMilliseconds);
}
}
}
public static bool IsFileLocked(string filename)
{
bool Locked = false;
try
{
FileStream fs =
File.Open(filename, FileMode.OpenOrCreate,
FileAccess.ReadWrite, FileShare.None);
fs.Close();
}
catch (IOException ex)
{
Locked = true;
}
return Locked;
}