Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 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; Вона стає довідником, де розташована А. Неважко знайти, що папка, яка з'являється при завантаженні, — це C:\Windows\System32, оскільки програма самозавантаження також викликається процесом у Windows.

Тому, якщо програма winform хоче отримати каталог, де розташований поточний додаток, краще не використовувати System.Environment.CurrentDirectory. Натомість це: Application.StartupPath Таким чином не має значення, хто його викликає.

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




Переведено з:Вхід за гіперпосиланням видно.




Попередній:Порівняння фланелевої та каліко-мережевої мережі K8S
Наступний:C# розміщує DLL бібліотеки референсів у підпапки шляхом зондування
 Орендодавець| Опубліковано 10.11.2020 15:08:26 |
C# — це набір методів для отримання поточного шляху запущеної програми

Отримайте повний шлях до поточного процесу, включаючи ім'я файлу (ім'я процесу).
String str = це. GetType(). Асамблея.Місцезнаходження;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

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

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

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

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

Отримайте шлях до виконуваного файлу, який запускав застосунок, без імені виконуваного файлу.
string str = System.Windows.Forms.Application.StartupPath;
result: X:\xxx\xxx (.exe文件所在的目录)

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

Отримайте поточний робочий каталог додатку (ненадійний).
string 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