应用程序无法访问文件,即使我可以使用资源管理器复制它

时间:2016-06-23 08:07:55

标签: c# file-access usergroups

我们公司的内部应用程序要求在启动时读取文件夹X中的文件aa,bb ... zz。当我(作为FullControl访问文件夹X的人)启动应用程序时,一切顺利。当我的任何同事(只对文件夹X具有“读取权限”)启动应用程序时,他们会收到“拒绝访问权限”的文件..."例外。

以下例程正在读取文件

        public static void readFromBinaryFile(this QIHasFileIo xThis, string xFilePath)
        {
            if (!System.IO.File.Exists(xFilePath))
                throw new System.Exception("File to read " + xFilePath + " does not exist ... ");

            if (xThis == null)
                throw new NullReferenceException("xThis cannot be null, as it is a readonly reference ... ");

            using (BinaryReader xReader = new BinaryReader(new FileStream(xFilePath, FileMode.Open, FileAccess.Read)))
                xThis.readObject(xReader);
        }

即。我正在指定读取模式,而该模式又应该只需要对该文件夹的“读取”访问权限。当我的同事在资源管理器中转到文件夹X时,可以将aa,bb,...文件复制到他们的桌面,这意味着他们对文件具有读取权限。

所以我很感兴趣。这种奇怪的行为始于几天前对数据服务器的更改。最值得注意的变化是1 /我的同事停止拥有数据服务器上的管理员权限2 /某些GPO可能已经搞砸了(它发生在公司之前)。 IT部门也很困惑,所以我不知道如何继续。

非常感谢任何提示, 丹尼尔

修改:使用FileShare.ReadWrite建议的已删除帖子。我很感谢作者的评论,但是保证文件没有写入锁定。因此,why File.copy works but File.OpenRead prompts access denied?线程与此无关。

2 个答案:

答案 0 :(得分:1)

我在阅读文件时遇到了类似的问题。问题在于ActiveDirectory组对特定组(读者组)的访问级别未正确设置。 我不确定您是否在服务器上使用AD组身份验证。我建议你检查你的同事所拥有的访问类型和组。此外,您需要检查应用程序当前如何验证用户是否可以访问该目录。

答案 1 :(得分:1)

您需要将FileShare.ReadWrite添加到传递给FileStream构造函数的参数中。

这可以防止应用程序尝试获取独占读取锁定,这在某些可能存在共享读写锁定的情况下可能是不可能的(例如文件被另一个进程写入而保持打开状态)。