В моей недавней работе я хочу создать небольшой инструмент для напоминаний клиентам; Естественно, программа winform должна читать конфигурационный файл той же папки, что и приложение (не exe.config);
Чтобы прочитать каталог, где находится текущее приложение, я сразу подумал о System.Environment.CurrentDirectory, чтобы получить текущий рабочий каталог. Программа работает безупречно;
Когда я пришёл на работу на следующее утро, появилось: «Отсутствует файл конфигурации прочитанного». Приложение добавляет автозапуск при загрузке. Это сообщение появляется, чтобы прочитать ошибку конфигурационного файла, сразу проверяя, был ли файл конфигурации из каталога приложения удалён самостоятельно. После проверки я обнаружил, что файл всё ещё там, я вышел из программы и запустил её снова
Всё в порядке, профиль всплывающего окон не пропадает. А потом проверьте, нет ли путь загрузочной записи в реестре? Судя по файлу пути, всё нормально. Немного запутался? Выйти из компьютера и попробовать перезагрузить — всё равно появляется отсутствующий конфигурационный файл. Причина, по которой не удаётся найти дорогу, будет понята напрямую
MessageBox программа запускается и обнаруживает, что путь действительно является этим путём.
Добавьте код MessageBox и продолжайте загрузку теста. Когда я загрузился, я обнаружил, что текущая папка была C:\Windows\System32, и я сразу был озадачен. Я подумал: может быть, программа Лао-цзы работала до system32? Проверяю реестр, и на sysetm32 моего приложения нет. Наконец, я подумал, что должна быть проблема с кодом для получения пути.
После многократных тестов было установлено, что System.Environment.CurrentDirectory действительно предназначен для получения текущей директории, но если программа A вызывает программу B, а программа B использует System.Environment.CurrentDirectory для получения каталога. Тогда каталог, полученный в программе B, уже не является каталогом, в котором находится приложение B; Он становится справочником, где находится A. Несложно найти, что папка, которая появляется при загрузке, называется C:\Windows\System32, потому что программа самозапуска загрузки также вызывается процессом в Windows.
Поэтому, если программа WinForm хочет получить каталог, в котором находится текущее приложение, лучше не использовать System.Environment.CurrentDirectory. Вместо этого это: Application.StartupPath Таким образом, неважно, кто его вызывает.
Тестовый код:
Переведён из:Вход по гиперссылке виден.
|