c# - 读取从 "Scanners and Cameras"打开的文件会抛出 UnauthorizedAccessException

标签 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 路线,而是通过相机界面处理文件。

最佳答案

文件是只读的。我应该检查这个!

当然有很多方法可以处理这个问题。起初我想“我会强制关闭只读属性”但后来我想“等等,我不需要这样做,毕竟我只是在阅读文件”这么长的故事让我深入了解我的 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);
    }
}

但是,为了让其他人可以完整地回答这个问题,您可以使用这段代码放弃只读:

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

关于c# - 读取从 "Scanners and Cameras"打开的文件会抛出 UnauthorizedAccessException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3963723/

相关文章:

c# - CollectionView.View.Refresh 上的内存泄漏

c# - Windows图像采集——C#中设置设备属性

c# - 通过 Feeder 进行 WIA 扫描

c# - 通过表达式调用可枚举平均值

c# - 是否可以为 asp :Calendar 添加新的下一个和上一个按钮

c# - 啊,对服务层感到如此困惑

java - JAVA 的 TWAIN/WIA 实现

c# - AcmNotPossible 调用 acmStreamOpen,naudio

c# 相当于 clojure 中的 base64 + UrlTokenEncode

c# - .NET 集成框架