Jak znaleźć ścieżkę aplikacji w aplikacji konsoli?
W Windows Forms mogę użyć Application.StartupPath
do znalezienia bieżącej ścieżki, ale wydaje się, że nie jest ona dostępna w aplikacji konsolowej.
c#
.net
console
console-application
JSmyth
źródło
źródło
Odpowiedzi:
System.Reflection.Assembly.GetExecutingAssembly()
. 1Location
Połącz to z,
System.IO.Path.GetDirectoryName
jeśli wszystko, czego chcesz, to katalog.źródło
GetExecutingAssembly
zwraca zestaw, który zawiera aktualnie wykonywany kod . To niekoniecznie musi być zestaw .exe konsoli . Może to być zespół, który został załadowany z zupełnie innej lokalizacji. Będziesz musiał użyćGetEntryAssembly
! Należy również pamiętać, żeCodeBase
może nie być ustawiony, gdy zestaw znajduje się w GAC. Lepszą alternatywą jestAppDomain.CurrentDomain.BaseDirectory
.Możesz użyć następującego kodu, aby uzyskać bieżący katalog aplikacji.
źródło
BaseDirectory
można to ustawić w czasie wykonywania? Ma tylko getter.Masz dwie opcje znalezienia katalogu aplikacji, który wybierzesz zależy od celu.
źródło
var localDirectory = new Uri(directory).LocalPath;
Prawdopodobnie trochę późno, ale warto o tym wspomnieć:
Lub bardziej poprawnie, aby uzyskać tylko ścieżkę do katalogu:
Edytować:
Sporo osób zauważyło, że
GetCommandLineArgs
nie ma gwarancji zwrócenia nazwy programu. Zobacz Pierwsze słowo w wierszu poleceń to nazwa programu tylko zgodnie z konwencją . Artykuł stwierdza, że „Chociaż bardzo niewiele programów Windows używa tego dziwactwa (sam nie jestem świadomy)”. Można więc „sfałszować”GetCommandLineArgs
, ale mówimy o aplikacji konsolowej. Aplikacje konsolowe są zwykle szybkie i brudne. To pasuje do mojej filozofii KISS.źródło
Dla wszystkich zainteresowanych aplikacjami internetowymi asp.net. Oto moje wyniki 3 różnych metod
wynik
aplikacja działa fizycznie z „C: \ inetpub \ SBSPortal_staging”, więc pierwsze rozwiązanie zdecydowanie nie jest odpowiednie dla aplikacji internetowych.
źródło
Powyższa odpowiedź wyniosła 90% tego, czego potrzebowałem, ale zwróciło mi Uri zamiast zwykłej ścieżki dla mnie.
Jak wyjaśniono w poście na forach MSDN, jak przekonwertować ścieżkę URI na normalną ścieżkę do pliku? , Użyłem następujących:
źródło
File.CreateDirectory(path)
, da ci wyjątek, że nie zezwala na ścieżki URI ...#
znak). Identyfikator i wszystko po nim jest obcinane ze ścieżki wynikowej.new Uri
iSystem.IO.Path.GetDirectoryName
? To daje normalny ciąg ścieżki zamiastUri
.Być może chcesz to zrobić:
źródło
możesz zamiast tego użyć tego.
źródło
Jeśli szukasz sposobu zgodnego z .NET Core, użyj
Zostało to wprowadzone w .NET Framework 4.6 i .NET Core 1.0 (i .NET Standard 1.3). Zobacz: Właściwość AppContext.BaseDirectory .
Według tej strony ,
źródło
Process.GetCurrentProcess().MainModule.FileName
W przypadku aplikacji konsolowych możesz spróbować:
Dane wyjściowe (na moim komputerze lokalnym):
Lub możesz spróbować (na końcu jest dodatkowy ukośnik odwrotny):
Wynik:
źródło
BaseDirectory
Można to ustawić w środowisku uruchomieniowym. NIE gwarantuje się poprawności”Użyłem tego kodu i otrzymałem rozwiązanie.
źródło
Możesz po prostu dodać do referencji do projektu,
System.Windows.Forms
a następnie użyćSystem.Windows.Forms.Application.StartupPath
jak zwykle.Nie potrzeba więc bardziej skomplikowanych metod ani korzystania z odbicia.
źródło
Używam tego, jeśli exe ma zostać wywołany przez podwójne kliknięcie
źródło
używałem
kiedy chcę znaleźć ścieżkę względem folderu aplikacji. Działa to zarówno dla aplikacji ASP.Net, jak i winform. Nie wymaga również żadnego odniesienia do zestawów System.Web.
źródło
Następująca linia poda ścieżkę aplikacji:
Powyższe rozwiązanie działa poprawnie w następujących sytuacjach:
mkbundle
(żadne inne metody nie działają)źródło
Mam na myśli, dlaczego nie zastosować metody ap / invoke?
Użyłbyś go tak jak Application.StartupPath:
źródło
Assembly.GetEntryAssembly().Location
lubAssembly.GetExecutingAssembly().Location
Użyj w połączeniu z,
System.IO.Path.GetDirectoryName()
aby uzyskać tylko katalog.Te ścieżki
GetEntryAssembly()
iGetExecutingAssembly()
mogą być różne, chociaż w większości przypadków katalog będzie taka sama.Ze
GetEntryAssembly()
trzeba mieć świadomość, że to może powrócićnull
, gdy moduł wejścia jest niekontrolowana (czyli C ++ lub VB6 wykonywalny). W takich przypadkach można korzystaćGetModuleFileName
z interfejsu API Win32:źródło
w VB.net
działa dla mnie (Typ aplikacji: Biblioteka klas). Not sure about C # ... Zwraca ścieżkę bez nazwy pliku jako ciąg
źródło
Rozwiązuje problem polegający na odsyłaniu plików referencyjnych innych firm z pakietami instalacyjnymi.
źródło
Żadna z tych metod nie działa w szczególnych przypadkach, takich jak użycie dowiązania symbolicznego do pliku exe, zwracają one lokalizację łącza, a nie faktyczny plik exe.
Więc można użyć QueryFullProcessImageName, aby obejść ten problem :
źródło
Wypróbuj tę prostą linię kodu:
źródło
Innym rozwiązaniem jest użycie ścieżek względnych wskazujących bieżącą ścieżkę:
źródło
Nie widziałem, żeby ktokolwiek konwertował ścieżkę LocalPath dostarczoną przez odbicie .Net Core na użyteczną ścieżkę System.IO, więc oto moja wersja.
Zwróci to pełną ścieżkę w formacie „C: \ xxx \ xxx” do miejsca, w którym znajduje się kod.
źródło
Istnieje wiele sposobów na uzyskanie ścieżki wykonywalnej, z której powinniśmy skorzystać, zależnie od naszych potrzeb. Link do dyskusji na temat różnych metod.
Różne sposoby uzyskania ścieżki wykonywalnej aplikacji
źródło
Oto niezawodne rozwiązanie, które działa z aplikacjami 32 - bitowymi i 64 - bitowymi .
Dodaj te referencje:
Dodaj tę metodę do swojego projektu:
Teraz użyj go w następujący sposób:
Zauważ, że jeśli znasz identyfikator procesu, ta metoda zwróci odpowiednią ścieżkę ExecutePath.
Dodatkowo dla zainteresowanych:
... da ci tablicę wszystkich aktualnie uruchomionych procesów i ...
... da ci bieżący proces, wraz z jego informacjami, np. Id, itp., a także ograniczoną kontrolę, np. Kill itp. *
źródło
Możesz utworzyć nazwę folderu jako Zasoby w projekcie za pomocą Eksploratora rozwiązań, a następnie możesz wkleić plik w Zasobach.
źródło