Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 31124|Отговор: 2

[Конзолна програма] Бъдете внимателни с System.Environment.CurrentDirectory, за да получите текущата директория

[Копирай линк]
Публикувано в 10.11.2020 г. 15:04:17 ч. | | | |
В последната си работа искам да създам малък инструмент за напомняния за клиенти; Естествено, 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 По този начин няма значение кой го извиква.

Тестов код:




Прехвърлен от:Входът към хиперлинк е видим.




Предишен:Сравнение на K8S мрежата за фланел и калико
Следващ:C# поставя DLL от референтната библиотека в подпапки чрез пробиране
 Хазяин| Публикувано в 10.11.2020 г. 15:08:26 ч. |
C# е колекция от методи за получаване на текущия път на работеща програма

Вземете пълния път към текущия процес, включително името на файла (името на процеса).
струнна сила = това. GetType(). Assembly.Location;
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