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

Вид: 31124|Ответ: 2

[Консольная программа] Будьте осторожны с System.Environment.CurrentDirectory, чтобы получить текущий каталог

[Скопировать ссылку]
Опубликовано 10.11.2020 15:04:17 | | | |
В моей недавней работе я хочу создать небольшой инструмент для напоминаний клиентам; Естественно, программа 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 Таким образом, неважно, кто его вызывает.

Тестовый код:




Переведён из:Вход по гиперссылке виден.




Предыдущий:Сравнение фланелевого и ситцевого сетя K8S
Следующий:C# помещает справочные библиотеки DLL в подпапки посредством зондирования
 Хозяин| Опубликовано 10.11.2020 15:08:26 |
C# — это набор методов для получения текущего запускающего пути программы

Получите полный путь к текущему процессу, включая имя файла (имя процесса).
str str = это. GetType(). Assembly.Location;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Полный путь к основному модулю, который получает новый компонент Process и связывает его с действующим процессом, включая имя файла (имя процесса).
строка str = System.Diagnostics.Process.GetCurrentProcess(). MainModule.FileName;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
строка str = System.Environment.CurrentDirectory;
result: X:\xxx\xxx (.exe文件所在的目录)

Получает базовый каталог текущего домена приложения текущего потока, который используется решателем конфликтов ассемблера для проверки ассемблера.
строка str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Получите и задайте имя каталога, в котором находится приложение. (Рекомендуемо)
строка str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Получите путь к исполняемому файлу, который запускал приложение, без имени исполняемого файла.
строка str = System.Windows.Forms.Application.StartupPath;
result: X:\xxx\xxx (.exe文件所在的目录)

//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
строка str = System.Windows.Forms.Application.ExecutablePath;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Получите текущий рабочий каталог приложения (ненадёжный).
строка str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
Опубликовано 22.09.2021 20:38:52 |
Научись учиться...
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com