读取从“扫描仪和照相机”打开的文件会抛出UnauthorizedAccessException

时间:2010-10-18 21:55:34

标签: c# .net wia

我们的应用程序要求用户从相机中选择照片。我测试的相机在添加此功能时将全部显示为“我的电脑”中的驱动器号,因此加载和处理图像是不费脑子的。一位同事给了我他的相机而不是作为驱动器安装它触发可怕的“扫描仪和相机向导”。我被鼓励看到在“我的电脑”中有一个相机的条目,我确实能够浏览并从标准的OpenFileDialog中选择文件。 - 太棒了!

除了当我尝试访问该文件时,我收到“UnauthorizedAccessException”。经过调查,我发现它实际上是从这个位置加载文件:     C:\ Documents and Settings \ sk \ Local Settings \ Temporary Internet Files \ Content.IE5 \ AXY0DNE3

世界上有什么?! IE5.5 ??

从这里开始,事情继续走下坡路。该位置显然是一个非常隐蔽的位置,我只能通过直接输入资源管理器栏中的路径导航到该位置。然后我想我可以将文件复制到临时位置并从那里使用它。所以我这样做但我仍然无法使用该文件,抛出相同的异常:     访问路径'C:\ Documents and Settings \ sk \ Local Settings \ Temp \ IMG_0005 [1] .jpg'被拒绝。

似乎权限设置与文件一起被复制(有意义)。

作为一种解决方法,我已指示我的用户使用可怕的小向导,将文件复制到临时位置,然后从那里选择它们。我不喜欢这个,但我需要今天部署此功能。有了解决方法,我现在想尝试让它工作,如果可能的话。理想情况下,我可以使用该文件而不将其复制到其他位置等。我不明白的是为什么抛出UnauthorizedAccessException。

我希望有人面临类似的挑战,并可以分享一些如何使用这些文件的技巧。我宁愿不去整个WIA路线并通过相机界面处理文件。

1 个答案:

答案 0 :(得分:0)

该文件为只读。我应该检查一下!

当然有很多方法可以解决这个问题。起初我以为“我只会强制只读属性”然后我想“等等,我不应该这样做,我毕竟只是阅读文件”这么长的故事简短让我深入了解我的IO库,发现我没有明确地将FileAccess设置为Read,就像我应该:

public static byte[] ReadWholeFileBytes(string filename)
{
    Guard.ArgumentNotNullOrEmptyString(filename, "filename");

    if(!File.Exists(filename))
    {
        throw new FileNotFoundException("Failed finding file " + filename);
    }

    using (Stream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
    {
        return ReadWholeStream(stream);
    }
}

然而,为了让其他人能够完成这个答案,您可以使用以下一点代码删除Read Only:

File.SetAttributes(openFile.FileName, FileAttributes.Normal);