试图打开共享文件夹上的文件时拒绝访问

本文关键字:文件 拒绝访问 文件夹 共享文件 共享 | 更新日期: 2023-09-27 18:11:54

我正在研究一个应用程序,它有一个输入文件夹来接收一些要处理的文件。不幸的是,我们的客户选择了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抛出了一个异常,并在方法内部处理它。我在catch语句上放了一些日志,看看它是否工作,我也只写了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。

在这种情况下,您需要实现像重试超时之类的东西。