У своїй останній роботі я хочу створити невеликий інструмент для нагадувань клієнтам; Звісно, програма 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 Таким чином не має значення, хто його викликає.
Тестовий код:
Переведено з:Вхід за гіперпосиланням видно.
|