2012-06-25 5 views
3

Я пытаюсь решить проблему, когда пользователь может попытаться открыть файл OpenFileDialog, который открывается Excel.Проверьте, заблокирован ли файл или ошибка catch для попытки открыть

Используя простой FileInfo.OpenRead(), он зажимает IOException: «Процесс не может получить доступ к файлу« cakes.xls », потому что он используется другим процессом». Это было бы хорошо отображать для пользователя, за исключением того, что пользователь фактически получит бессмысленность «Отладка строк ресурсов недоступна».

Кажется, невозможно открыть файл, который открыт другим процессом, так как с помощью FileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite) Патроны SecurityException, «операции файла не разрешен доступ к пути..„C: \ любой \ cakes.xls“отказано», для любого файла. Скорее бесполезно.

Таким образом, вам не удалось найти способ проверить, заблокирован ли файл или попытаться поймать исключение IOException. Я не хочу поймать все IOExceptions и предположить, что все они заблокированы файловыми ошибками, поэтому мне нужно каким-то образом классифицировать этот тип исключений, как эта ошибка ... но вздор «отладочные строки ресурсов» вместе с тот факт, что это сообщение, вероятно, локализовано, делает его сложным. Я частично доверяю, поэтому я не могу использовать Marshal.GetHRForException.

Итак: Есть ли разумный способ проверить, заблокирован ли файл или, по крайней мере, определить, возникла ли эта проблема, не просто поймав все IOExceptions?

+0

Вы проверили различные свойства объекта IOException? Может быть, получить только часть сообщения, а не по умолчанию ToString() даст вам действительную обратную связь для пользователя? – jv42

+0

К сожалению, это сообщение, которое переходит в строку «Отладка строк ресурсов недоступна» в выпуске. Стандартная клиентская версия среды выполнения Silverlight не содержит сообщений об ошибках. Метод ToString() дает не что иное, как трассировку стека. –

ответ

2

Я только что сработал: это так же просто, как чтение документации.

FileInfo.Open указывает:

  • FileNotFoundException - Файл не найден.
  • UnauthorizedAccessException - Файл доступен только для чтения или является каталогом .
  • DirectoryNotFoundException - Указанный путь недействителен, например, на неотключенном диске.
  • IOException - Файл уже открыт.

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

+0

Итак, почему вы получили SecurityException? Это еще один случай, не так ли? – jv42

+1

Существует пара различных переопределений для FileInfo.Open. У [с большинством параметров] (http://msdn.microsoft.com/en-us/library/d3wke8tz) есть больше исключений, включая SecurityException. –

+0

А, это имеет смысл, поскольку вы не можете запрашивать эксклюзивный доступ и т. Д. С более простыми версиями. – jv42

Смежные вопросы