В последната си работа искам да създам малък инструмент за напомняния за клиенти; Естествено, winform програмата трябва да чете конфигурационния файл на същата директория като приложението (не exe.config файла);
За да прочета директорията, в която се намира текущото приложение, веднага се сетих за System.Environment.CurrentDirectory, за да получа текущата работеща директория. Програмата изглежда работи безупречно;
Когато дойдох на работа на следващата сутрин, се появи: "Пропуска конфигурационен файл за четене". Приложението добавя автоматично стартиране при стартиране. Това съобщение се появява, за да се прочете грешката на конфигурационния файл, веднага проверявайки дали конфигурационният файл в директорията на приложението е изтрит сам. След като проверих, установих, че файлът все още е там, излязох от програмата и я стартирах отново
Все още е наред, няма липсващ профил за четене с изскачащи прозорци. После провери дали пътят на записа за зареждане в регистъра не е в моята директория? Като гледам path файла, всичко е наред. Малко объркан? Излез от компютъра и опиташ да рестартираш, но все пак изскача, че конфигурационният файл липсва. Причината да не можеш да намериш пътя ще бъде посочена директно
MessageBox, програмата стартира и установява, че пътят наистина е този път.
Добави кода на MessageBox и продължи да стартираш теста. Когато стартирах, установих, че текущата директория, която се появи, беше C:\Windows\System32, и веднага се обърках. Помислих си, възможно ли е програмата на Лао Дзъ да е стигнала до system32? Проверявам регистъра и sysetm32 няма моето приложение. Накрая реших, че трябва да има проблем с кода, за да се получи пътят.
След многократни тестове беше установено, че System.Environment.CurrentDirectory наистина трябва да получи текущата директория, но ако програма А извиква програма B, а програма B използва System.Environment.CurrentDirectory, за да получи директорията. Тогава директорията, получена в B програмата, вече не е директорията, в която се намира B приложението; Той става директорията, в която се намира А. Не е трудно да открия, че директорията, която се появява при стартиране, е C:\Windows\System32, защото програмата за самостартиране на зареждане също се извиква от процес в Windows.
Затова, ако winform програмата иска да получи директорията, в която се намира текущото приложение, най-добре е да не се използва System.Environment.CurrentDirectory. Вместо това е: Application.StartupPath По този начин няма значение кой го извиква.
Тестов код:
Прехвърлен от:Входът към хиперлинк е видим.
|