访问被拒绝尝试打开共享文件夹上的文件

时间:2013-05-02 13:26:25

标签: c# unix exception file-io

我正在开发一个应用程序,它有一个输入文件夹来接收一些要处理的文件。不幸的是,我们的客户已选择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服务,当服务重新启动时,它正常工作,因为内容已经写入文件本身。

有什么想法吗? 谢谢。

1 个答案:

答案 0 :(得分:0)

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

你需要在这种情况下实现类似于超时的重试。

相关问题