【问题标题】:Access denied attempting to open a file on a shared folder访问被拒绝尝试打开共享文件夹中的文件
【发布时间】:2013-05-02 13:26:24
【问题描述】:

我正在开发一个应用程序,它有一个输入文件夹来接收一些要处理的文件。不幸的是,我们的客户选择了UNIX作为他的操作系统来运行他的主要软件,并且他有共享文件夹,我们可以通过网络获取内容。他的主要软件写文件很奇怪:首先,它创建文件,然后将内容写入文件中。我正在处理的应用程序会在文件放入文件夹并处理文件的那一刻捕获文件。在这种情况下,我们在访问文件时发生了“争执”,因为主软件正在写入内容,而我的应用程序试图打开只是为了查看它是否被另一个进程使用。每次我尝试打开文件时,都会引发异常,但我的 catch 语句并没有按原样捕获异常。

当我试图打开文件以查看它是否被另一个进程使用时,使用以下代码:

public static void IsOpen(string file)
{
    bool isOpen = true;

    while (isOpen)
    {
        try
        {
            using (File.Open(file, FileMode.Open, FileAccess.Read, FileShare.None))
            {
                isOpen = false;
            }
        }
        catch (FileNotFoundException exp)
        {
            throw new Exception(exp.Message);
        }
        catch (DirectoryNotFoundException exp)
        {
            throw new Exception(exp.Message);
        }
        catch (IOException)
        {
            isOpen = true;
            Thread.Sleep(500);
        }
    }
}

看起来File.Open 正在抛出异常并在方法内处理它。我在 catchs 语句上放了一些日志,看看它是否有效,我也只写了catch (Exception),但它也不起作用。

当我的应用程序尝试打开正在被另一个进程使用的文件时,它会在事件查看器上写入此消息:Access to the path '<path here>' is denied,以及此错误日志:

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at Utilities.IsOpen(String strFile)

我认为它正在抛出一个UnauthorizedAccessException,但我的应用程序是一个 Windows 服务,当服务重新启动时它可以正常工作,因为内容已经写入文件本身。

有什么想法吗? 谢谢。

【问题讨论】:

  • 您需要能够应对这种情况。您确实会收到 UnauthorizedAccessException。您需要针对这种情况实施类似超时重试的操作。

标签: c# unix exception file-io


【解决方案1】:

您需要能够应对这种情况。您确实会收到 UnauthorizedAccessException。

您需要针对这种情况实施类似超时重试的操作。

【讨论】:

  • 万一你有一段代码,因为我不明白你的意思。
  • @GuilhermeOliveira 如果访问被拒绝,请等待 5 秒钟,然后重试。如果你再试太多次,那就放弃吧。
  • 是的,我已经试过了,但还是不行。我将 catch 语句用于获取带有事件查看器日志的 UnauthorizedAccessException,以检查它是否发生,但不幸的是它没有发生,现在我不知道该怎么办。
  • 实际上,我正在更新客户上的 dll,但我犯了重建错误 dll 的错误。当我意识到我错了,我将 catch 语句放入 UnauthorizedAccessException 并且效果很好。无论如何,谢谢你的帮助。
猜你喜欢
  • 2019-11-12
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
相关资源
最近更新 更多