Файл исключения system io filenotfoundexception не найден

Обновлено: 04.07.2024

Синтаксис:

Веб-разработка, языки программирования, тестирование программного обеспечения и другое

Каждый метод, класс или исключение имеет свой стандартный синтаксис.

В случае исключения FileNotFound стандартный синтаксис выглядит следующим образом:

открытый класс FileNotFoundException :System.IO.IOException

Исключение FileNotFound является частью IOException, которое унаследовано от SystemException, поднимаясь до класса Exception и Object.

  • Исключение FileNotFoundException реализует HRESULT COR_E_FILENOTFOUND, который содержит значение 0x80070002.
  • Это исключение FileNotFound обычно возникает при работе с операциями ввода-вывода для файлов.
  • Если код не находит файл, он создает новый экземпляр FileNotFoundException() вместе со своей строкой сообщения, которая представляет собой установленное системой сообщение об ошибке.
  • В различных конструкторах можно добавить строку, отобразить контекстную информацию и сообщение об ошибке.
  • Кроме того, другой конструктор может предоставить ссылку на внутреннее исключение, вызвавшее это исключение.

Ниже приведены упомянутые примеры:

Код:

используя Систему;
с помощью System.IO;
class Program static void Main() попробуйте использовать (StreamReaderfilereader = new StreamReader("nofile.txt")) filereader.ReadToEnd();
>
>
catch (FileNotFoundException ex) Console.WriteLine(ex);
>
>
>

Пояснение:

  • Мы просто начали с системных файлов. System.IO является здесь важным файлом импорта, так как мы будем выполнять операции над файловым вводом и выводом. Затем у нас есть наш класс и основной метод. Мы уже вошли в наш блок try catch, чтобы перехватить исключение. Затем у нас есть класс StreamReader, который находится в пространстве имен system.IO.
  • Класс StreamReader используется для чтения текстового файла. Он прост в использовании и обеспечивает хорошую производительность. В StreamReader у нас есть объект, который вызывает файл nofile.txt, которого, как мы знаем, не существует. Затем у нас есть метод ReadToEnd, который будет читать файл до конца, если он будет найден. Наконец, у нас есть наш блок catch, который, конечно же, пока мы говорим, содержит исключение FileNotFound, и когда он его перехватывает, он будет напечатан в операторе вывода в следующей строке.
  • При успешном выполнении приведенного выше кода будет выводиться исключение «Не удалось найти файл…».

Вывод:

Здесь мы выполним код, аналогичный коду выше, но без блока try catch, это будет простая программа, где мы не можем догадаться, что именно может пойти не так.

Код:

с помощью System.IO;
используя Систему;
class Program static void Main() с использованием (StreamReaderfilereader = new StreamReader("incorrectfilename.txt")) filereader.ReadToEnd();
>
>
>

Пояснение:

  • В нашем втором примере код почти аналогичен нашему первому примеру, но мы специально не реализовали какой-либо способ перехвата исключения. Начал с системного файла, потом наш класс и основной метод. Затем переходим к StreamReader, нам передается имя нашего файла, что неверно, и в следующей строке мы пытаемся прочитать файл до конца.
  • Но мы не пытались поймать или идентифицировать исключение здесь, это сценарий, в котором мы считаем, что файл существует, и поэтому мы не ожидаем никаких исключений. После выполнения будет напечатано необработанное исключение и будет выдано сообщение «System.IO.FileNotFoundException: не удалось найти файл».

Вывод:

И, как вы можете видеть, в отличие от нашего предыдущего примера, это необработанное исключение, и результат соответствует ожидаемому.

Как и любого другого исключения, этого исключения FileNotFound можно избежать. Из способов, которые мы можем использовать, чтобы избежать этого исключения, рекомендуется метод File.Exists. Когда мы не уверены, что файл, который мы передаем в качестве аргумента, недоступен по исходной ссылке, лучше использовать метод File.Exists. Рекомендуется использовать метод File.Exists.

Пример:

Мы будем использовать метод File.Exists в программе и посмотрим, как его можно использовать дальше.

Код:

с помощью System.IO;
используя Систему;
class Program static void Main() bool ifexists = File.Exists("incorrectfilename.txt");
Console.WriteLine("\n "+ifexists);
>
>

Пояснение:

  • Наш код здесь идеален на тот случай, если мы не уверены в существовании файла, который собираемся использовать. Это простая реализация, у нас может быть такой код в циклах, где он проверяет разные или альтернативные файлы, и для операции выбирается тот, который существует.
  • У нас есть метод File.Exists, в который мы передаем имя файла и проверяем, существует ли он.
  • Теперь в следующей строке у нас есть оператор печати, который выводит логическое значение, True или False, в зависимости от существования файла.Наш файл не существует, поэтому он должен вернуть false.

Вывод:

Заключение

В заключение отметим, что исключение FileNotFound происходит из пространства имен системы ввода-вывода класса объекта. FileNotFoundException отвечает за возникновение случаев, когда мы передаем файл или пытаемся выполнить операции ввода или вывода с файлом, но файл не существует. Другими причинами могут быть неправильное имя файла или неверная ссылка на источник. Чтобы избежать этого исключения, можно использовать метод File Exists.

Рекомендуемые статьи


@ShaunLuttin Понятия не имею, есть код кода и нет подробного ведения журнала предоставленного исключения.

@ErikPhilips В программе WPF всегда есть основной метод, независимо от того, пишете вы его лично или нет. См. этот вопрос.

4 ответа 4

Мне не хочется указывать на очевидное, но System.IO.FileNotFoundException означает, что программа не нашла указанный вами файл. Итак, что вам нужно сделать, это проверить, какой файл ваш код ищет в рабочей среде.

Чтобы узнать, какой файл ваша программа ищет в рабочей среде (посмотрите на свойство FileName исключения), попробуйте следующие методы:

  • запись в журнал отладки,
  • используйте приложение Visual Studio к процессу или
  • использовать удаленную отладку Visual Studio

Затем просмотрите файловую систему на компьютере и проверьте, существует ли файл. Скорее всего дело в том, что его не существует.



Я отметил это как ответ, потому что это заставило меня использовать "присоединить к процессу". Затем я отредактировал ответ, включив присоединение к процессу в качестве параметра отладки.

@usefulBee Это означает, что вам нужно сохранить некоторые записи о том, что произошло, и соответствующую информацию, которая будет полезна при отладке. Вы можете создать собственное решение для ведения журналов, но настоятельно рекомендуется ознакомиться с уже существующими библиотеками, такими как Serilog, NLog и т. д.

Означает ли это, что невозможно найти отсутствующий файл по данным, предоставленным средством просмотра событий?

@usefulBee Это зависит от того, что находится в средстве просмотра событий. Я, конечно, не стал бы полагаться на то, что в нем. Возьмите ведение журнала в свои руки и контролируйте, что именно регистрируется.

Я столкнулся с похожей ситуацией после публикации приложения ClickOnce, и один из моих коллег в другом домене сообщил, что оно не запускается.

Чтобы выяснить, что происходит, я добавил оператор try catch в метод MainWindow, как @BradleyDotNET упомянул в одном комментарии к исходному сообщению, а затем снова опубликовал.

Затем мой коллега сообщил мне подробности исключения, и это была отсутствующая ссылка на файл DLL сторонней платформы.

Добавил ссылку и проблема решена.


Меня не раз вводила в заблуждение эта ошибка. Потратив несколько часов на гугление, обновление пакетов nuget, проверку версий, а затем, посидев с полностью обновленным решением, я вновь осознал вполне действительную и более простую причину ошибки.

Если в многопоточном установлении (например, UI Dispatcher.Invoke), System.IO.FileNotFoundException выдается, если dll (файл) диспетчера потоков не возвращается. Таким образом, если ваш основной поток пользовательского интерфейса A вызывает dll диспетчера системных потоков B, а B вызывает код вашего потока C, но C выбрасывает по какой-то несвязанной причине (например, null Reference, как в моем случае), тогда C не возвращает, B делает не возвращаются, и A обвиняет только B с FileNotFoundException в потере.

Перед переходом к пути версии dll. Проверьте ближе к дому и убедитесь, что ваш код потока не генерируется.

Внимательно проверьте все ссылки

  • Версия остается одинаковой на целевом и локальном компьютерах.
  • Если на сборку ссылается GAC, убедитесь, что загружена правильная версия

Для меня очистка всего решения путем удаления вручную, повторного обновления (удаления и добавления) ссылок с версией, синхронизированной с целевой машиной, а затем сборка с помощью Copy Local > False для сборок GAC решает проблему.

Некоторая информация относится к предварительной версии продукта, которая может быть существенно изменена до ее выпуска. Microsoft не дает никаких явных или подразумеваемых гарантий в отношении представленной здесь информации.

Исключение, возникающее при неудачной попытке доступа к несуществующему на диске файлу.

Примечания

FileNotFoundException использует HRESULT COR_E_FILENOTFOUND со значением 0x80070002.

Конструкторы

Инициализирует новый экземпляр класса FileNotFoundException со строкой сообщения, заданной как системное сообщение.

Инициализирует новый экземпляр класса FileNotFoundException с указанной сериализацией и контекстной информацией.

Инициализирует новый экземпляр класса FileNotFoundException с указанным сообщением об ошибке.

Инициализирует новый экземпляр класса FileNotFoundException с указанным сообщением об ошибке и ссылкой на внутреннее исключение, которое является причиной этого исключения.

Инициализирует новый экземпляр класса FileNotFoundException с указанным сообщением об ошибке и именем файла, который не может быть найден.

Инициализирует новый экземпляр класса FileNotFoundException с указанным сообщением об ошибке, именем файла, который не может быть найден, и ссылкой на внутреннее исключение, являющееся причиной этого исключения.

Свойства

Получает набор пар "ключ-значение", которые предоставляют дополнительную определяемую пользователем информацию об исключении.

Получает имя файла, который не может быть найден.

Получает файл журнала, в котором описывается, почему не удалось загрузить сборку.

Получает или задает ссылку на файл справки, связанный с этим исключением.

Получает или задает HRESULT, закодированное числовое значение, которое назначается определенному исключению.

Получает экземпляр Exception, вызвавший текущее исключение.

Получает сообщение об ошибке, объясняющее причину исключения.

Получает или задает имя приложения или объекта, вызвавшего ошибку.

Получает строковое представление ближайших кадров в стеке вызовов.

Получает метод, выдающий текущее исключение.

Методы

Определяет, равен ли указанный объект текущему объекту.

При переопределении в производном классе возвращает исключение, являющееся основной причиной одного или нескольких последующих исключений.

Служит хеш-функцией по умолчанию.

Задает объект SerializationInfo с именем файла и дополнительной информацией об исключении.

При переопределении в производном классе устанавливает SerializationInfo с информацией об исключении.

Получает тип среды выполнения текущего экземпляра.

Создает поверхностную копию текущего объекта.

Возвращает полное имя этого исключения и, возможно, сообщение об ошибке, имя внутреннего исключения и трассировку стека.

События

Происходит при сериализации исключения для создания объекта состояния исключения, содержащего сериализованные данные об исключении.

Симптомы

Причина

Вы можете получить сообщение об ошибке, если выполняется одно из следующих условий:

Рабочий процесс не имеет прав на чтение во временный каталог процесса, а рабочий процесс не имеет прав на запись во временный каталог процесса.

Класс XmlSerializer на лету генерирует и компилирует код для выполнения сериализации и десериализации. XmlSerializer использует объектную модель документа кода (CodeDom) для выполнения компиляции. Компиляция CodeDom использует временные файлы на диске. Если рабочий процесс не имеет разрешений на чтение каталога Temp и разрешений на запись в каталог Temp, все вызовы веб-службы завершатся ошибкой. Поэтому рабочему процессу требуются права на чтение для каталога Temp и права на запись для каталога Temp.

В коде, сгенерированном XmlSerializer, есть ошибки компиляции.

Решение 1. Назначьте разрешения учетной записи рабочего процесса в каталоге Temp

Если вы используете олицетворение, олицетворяемый пользователь должен иметь полный доступ к каталогу Temp.

Чтобы назначить необходимые разрешения учетной записи рабочего процесса в каталоге Temp, выполните следующие действия:

В Проводнике Windows найдите каталог %windir%\temp .

Щелкните правой кнопкой мыши %windir%\temp и выберите "Свойства".

В окне "Свойства" выберите вкладку "Безопасность".

Нажмите "Добавить", введите ServerName\ASPNET и нажмите "ОК".

Замените ServerName именем веб-сервера.

Замените ASPNET на NETWORK SERVICE, если вы развернули приложение в IIS 6.0.

В разделе "Разрешить" установите флажок "Полный доступ" и нажмите кнопку "ОК".

Решение 2. Найдите ошибки компилятора в коде, сгенерированном XmlSerializer

Чтобы найти ошибки, созданные компилятором, необходимо добавить переключатель в файл Web.config, чтобы сохранить файлы, созданные компилятором. Для этого выполните следующие действия:

Откройте файл Web.config в текстовом редакторе, например в Блокноте.

Запустите клиентское приложение.

Клиентское приложение вызывает веб-службу.

Убедитесь, что в каталоге %windir%\temp есть файл _tmpname.00.cs и файл _tmpname.out.

Файл _tmpname.00.cs является сгенерированным источником. Файл _tmpname.out должен содержать ошибки компилятора.

Включите разрешения на чтение и включите разрешения на запись для учетной записи рабочего процесса (ASPNET или NETWORK SERVICE), чтобы записывать файлы %tmpname% в каталог Temp.

Статус

Такое поведение предусмотрено дизайном.

Шаги для воспроизведения поведения

В следующих разделах содержится информация о действиях по воспроизведению поведения.

Создать веб-службу

По умолчанию создается файл Service1.asmx.

Назовите проект WebServiceTemp.

В обозревателе решений щелкните правой кнопкой мыши Service1.asmx и выберите Просмотреть код.

В меню "Сборка" выберите "Создать решение".

Создание клиентского веб-приложения

Назовите проект WebAppTemp.

В обозревателе решений щелкните правой кнопкой мыши "Ссылки" и выберите "Добавить веб-ссылку".

Выберите "Перейти", а затем выберите "Добавить ссылку".

Дважды щелкните WebForm1, чтобы открыть код события Page_Load.

Добавьте следующий код в обработчик события Page_Load.

В меню "Сборка" выберите "Создать решение".

Установить права доступа к временному каталогу

Чтобы назначить необходимые разрешения учетной записи рабочего процесса в каталоге Temp, выполните следующие действия:

В проводнике Windows найдите каталог %windir%.

Щелкните правой кнопкой мыши %windir%\temp и выберите "Свойства".

В окне "Свойства" выберите вкладку "Безопасность".

Нажмите "Добавить", введите ServerName\ASPNET и нажмите "ОК".

Убедитесь, что флажок "Запись" не установлен в разделе "Разрешить", а затем нажмите "ОК".

Запустите веб-приложение.

Вы можете получить сообщение об ошибке, упомянутой в разделе "Проблемы" этой статьи.

Читайте также: