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_File Access - Fatal编程技术网

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;
        }