Cel mai bun mod de a obține dosar calea

Văd că există câteva modalități de a obține aplicația cale de folder:

  1. Cererea.StartupPath
  2. Sistemul.IO.Calea.GetDirectoryName( Sistem.Reflecție.De asamblare.GetExecutingAssembly().Locație)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. Sistemul.IO.Director.GetCurrentDirectory()
  5. Mediu.CurrentDirectory`
  6. Sistemul.IO.Calea.GetDirectoryName( Sistem.Reflecție.De asamblare.GetExecutingAssembly().GetName().CodeBase)
  7. Sistemul.IO.Calea.GetDirectory(Cerere.ExecutablePath)

Ceea ce este cel mai bun mod, în funcție de situație?

Comentarii la întrebare (4)
Soluția

AppDomain.CurrentDomain.BaseDirectory este probabil cel mai util pentru accesarea fișierelor a căror locație este relativă la aplicarea directorul de instalare.

Într-un ASP.NET cererea, aceasta va fi aplicarea directorul rădăcină, nu bin subfolder - care este, probabil, ceea ce vrei, de obicei. Într-o aplicație client, acesta va fi directorul care conține executabilul principal.

Într-un VSTO 2005 aplicație, acesta va fi directorul care conține VSTO reușit ansambluri pentru aplicația dumneavoastră, și nu, să zicem, calea Excel executabil.

Ceilalți se pot întoarce directoare diferite în funcție de mediul dumneavoastră - de exemplu, a se vedea @Vimvq1987's a răspunde.

CodeBase este locul în care un dosar a fost găsit și poate fi un URL care începe cu http://. În cazul în care "Locație" va fi, probabil, adunarea a descărca cache. CodeBase nu este garantat de a fi setat pentru ansambluri în RGA.

Comentarii (10)
  1. Cererea.StartupPath și 7.Sistemul.IO.Calea.GetDirectoryName(Cerere.ExecutablePath)` - Este doar de gând să lucreze pentru [Windows Forms][1]

  2. Sistemul.IO.Calea.GetDirectoryName( Sistem.Reflecție.De asamblare.GetExecutingAssembly().Locație)

Este de gând să vă dau ceva de genul: ` "C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\juridice-servicii\e84f415e\96c98009\assembly\dl3\42aaba80\bcf9fd83_4b63d101" care este în cazul în care pagina care se execută este.

  1. AppDomain.CurrentDomain.BaseDirectory pentru aplicații web ar putea fi util și va reveni ceva de genul"C:\hg\Services\Services\Services.Website\"` care este directorul de bază și este destul de util.

  2. Sistemul.IO.Director.GetCurrentDirectory() și 5. Mediu.CurrentDirectory`

veți obține locația în cazul în care procesul a fost concediat de la - atât pentru aplicație web care rulează în modul de depanare de la Visual Studio ceva de genul "C:\\Program Files (x86)\\IIS Express"

  1. Sistemul.IO.Calea.GetDirectoryName( Sistem.Reflecție.De asamblare.GetExecutingAssembly().GetName().CodeBase)

veți obține locația unde.dllcare se execută codul este, pentru o aplicație web care ar putea fi"fișier:\\C:\\hg\\Services\\Services\\Servicii.Site-ul\\bin"

Acum, în cazul în care, de exemplu, o consolă aplicație puncte 2-6 va fi directorul unde `.exe fișier este.

Sper că acest lucru vă economisește timp.

[1]: https://msdn.microsoft.com/en-us/library/system.windows.forms.application.startuppath(v=vs. 110).aspx

Comentarii (2)

Rețineți că nu toate aceste metode va returna aceeasi valoare. În unele cazuri, ei pot reveni la aceeași valoare, dar fii atent, scopurile lor sunt diferite:

Application.StartupPath

returnează StartupPath parametru (poate fi setat atunci când rulați aplicația)

System.IO.Directory.GetCurrentDirectory()

se întoarce directorul curent, care poate fi sau nu dosarul în care cererea este situat. Același lucru este valabil și pentru Mediu.CurrentDirectory`. În cazul în care utilizați acest lucru într-un fișier DLL, se va reveni la calea de unde procesul se execută (acest lucru este valabil mai ales în ASP.NET).

Comentarii (3)

Pentru o aplicație web, pentru a obține curent aplicație web director rădăcină, în general, numit prin pagina web pentru actuala cerere de intrare:

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

Codul de mai sus descriere

Comentarii (0)

Din experiența mea, cel mai bun mod este o combinatie dintre acestea.

  1. Sistemul.Reflecție.De asamblare.GetExecutingAssembly().GetName().CodeBase Vă va oferi folderul bin
  2. Director.GetCurrentDirectory() Funcționează bine pe .Net Core, dar nu .Net și vă va oferi directorul rădăcină al proiectului
  3. Sistemul.AppContext.BaseDirectory " și " AppDomain.CurrentDomain.BaseDirectory Funcționează bine în .Net dar nu .Net core și va oferi directorul rădăcină al proiectului

Într-o bibliotecă de clasă care ar trebui să target.Net și .Net core verific la ce cadru este de hosting library și selectați una sau alta.

Comentarii (0)

Am început un proces de un Serviciu Windows peste Win32 API în cadrul sesiunii de utilizator, care este, de fapt conectat (în Task Manager sesiunea 1 nu 0). În această a fost o putem cunoaște, care variabilă este cel mai bun.

Pentru toate cele 7 cazuri la întrebarea de mai sus, sunt următoarele rezultate:

Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram

Poate l's util pentru unii dintre voi, faci aceleași lucruri, atunci când căutați cel mai bun variabilă pentru cazul dumneavoastră.

Comentarii (1)

Am folosit cu succes

System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

Acesta funcționează chiar și în interiorul linqpad.

Comentarii (2)

Directorul rădăcină:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;
Comentarii (1)

acest un "Sistem.IO.Calea.GetDirectory(Cerere.ExecutablePath)" s-a schimbat la Sistem.IO.Calea.GetDirectoryName(Cerere.ExecutablePath)

Comentarii (0)

Dacă știi să te directorul rădăcină:

string rootPath = Path.GetPathRoot(Application.StartupPath)
Comentarii (0)