Чтение файла, открытого из «Сканеров и камер», вызывает UnauthorizedAccessException - PullRequest
2 голосов
/ 19 октября 2010

Наше приложение требует, чтобы пользователь выбрал фотографию со своей камеры. Камеры, которые я тестировал при добавлении этой функции, в «Моем компьютере» отображались как буква диска, поэтому загрузка и работа с изображением была простой задачей. Сотрудник дал мне свою камеру, которая вместо установки в качестве привода запускает ужасный «Мастер сканера и камеры». Я был рад видеть, что в «Моем компьютере» есть запись для камеры, и я действительно мог просматривать и выбирать файлы из стандартного OpenFileDialog. - БОЛЬШОЙ!

За исключением того, что, когда я пытаюсь получить доступ к файлу, я получаю "UnauthorizedAccessException". После расследования я вижу, что он на самом деле загружает файлы из этого места: C: \ Documents and Settings \ sk \ Локальные настройки \ Временные интернет-файлы \ Content.IE5 \ AXY0DNE3

Что на свете ?! IE5.5 ??

Отсюда дела идут вниз по склону. Это местоположение, по-видимому, очень хорошо спрятано, к которому я могу перейти, только непосредственно введя путь в панели обозревателя. Затем я решил, что могу просто скопировать файл во временную папку и работать с ним оттуда. Я сделал это, но все еще не могу работать с файлом, выдав то же исключение: Доступ к пути «C: \ Documents and Settings \ sk \ Local Settings \ Temp \ IMG_0005 [1] .jpg» запрещен.

Похоже, что настройки разрешений были скопированы вместе с файлом (имеет смысл).

В качестве обходного пути я дал указание своим пользователям использовать ужасного маленького волшебника, скопировать файлы во временную папку и затем выбрать их там. Мне это не нравится, но мне нужно было развернуть эту функцию сегодня. Теперь, когда есть обходной путь, я бы хотел, чтобы это работало, если это возможно. В идеале я мог бы просто работать с файлом, не копируя его в другие места и т. Д. Я не понимаю, почему выбрасывается исключение UnauthorizedAccessException.

Я надеюсь, что кто-то там столкнулся с подобной проблемой и может поделиться некоторыми советами о том, как работать с этими файлами. Я бы предпочел не идти по всему маршруту WIA и работать с файлами через интерфейс камеры.

1 Ответ

0 голосов
/ 19 октября 2010

Файл только для чтения.Я должен был это проверить!

Конечно, есть много способов справиться с этим.Сначала я подумал: «Я просто заставлю атрибут« только для чтения »вниз», но потом подумал: «Подожди, мне не нужно этого делать, я ведь только ЧИТАЮ файл». Короткая история, заставившая меня глубоко заглянуть вмоя библиотека ввода-вывода и обнаружил, что я не устанавливал FileAccess в явном виде для чтения, как я должен:

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);
...