Niedawno szukałem sposobu, aby uzyskać katalog aplikacji w Javie. W końcu znalazłem odpowiedź, ale potrzebowałem zadziwiająco długo, ponieważ poszukiwanie tak ogólnego terminu nie jest łatwe. Myślę, że dobrym pomysłem byłoby sporządzenie listy sposobów osiągnięcia tego w wielu językach.
Zapraszam do głosowania za / przeciw, jeśli pomysł Ci się nie podoba i prosimy o wniesienie wkładu, jeśli Ci się spodoba.
Wyjaśnienie:
Istnieje wyraźne rozróżnienie między katalogiem zawierającym plik wykonywalny a bieżącym katalogiem roboczym (podanym w pwd
systemie Unix). Pierwotnie interesowałem się tym pierwszym, ale zachęcam do publikowania metod określania również drugiego (wyjaśniając, który z nich masz na myśli).
language-agnostic
path
Konrad Rudolph
źródło
źródło
Odpowiedzi:
W Javie rozmowy
i
zwraca bieżący katalog roboczy.
Wezwanie do
zwraca ścieżkę do pliku JAR zawierającego bieżącą klasę lub element CLASSPATH (ścieżkę), który zwrócił bieżącą klasę, jeśli uruchamiasz bezpośrednio z systemu plików.
Przykład:
Twoja aplikacja znajduje się pod adresem
Otwórz powłokę (cmd.exe) i przejdź
cd
do podkatalogu C: \ test \.Uruchom aplikację za pomocą polecenia
java -jar C:\MyJar.jar
.Pierwsze dwa wywołania zwracają „C: \ test \ subdirectory”; trzecie wywołanie zwraca „C: \ MyJar.jar”.
Podczas uruchamiania z systemu plików, a nie z pliku JAR, wynikiem będzie na przykład ścieżka do katalogu głównego wygenerowanych plików klas
Ścieżka nie zawiera katalogów pakietów dla wygenerowanych plików klas.
Kompletny przykład pobierania katalogu aplikacji bez nazwy pliku .jar lub odpowiedniej ścieżki do plików klas, jeśli jest uruchamiana bezpośrednio z systemu plików (np. Podczas debugowania):
źródło
Class.getResource()
służy.W .NET (C #, VB,…) można wysyłać zapytania do bieżącej
Assembly
instancji o plikLocation
. Jednak do tego dołączona jest nazwa pliku wykonywalnego. Poniższy kod czyści ścieżkę (using System.IO
iusing System.Reflection
):Alternatywnie możesz użyć informacji dostarczonych przez,
AppDomain
aby wyszukać przywoływane zestawy:VB umożliwia inny skrót za pośrednictwem
My
przestrzeni nazw:źródło
W systemie Windows użyj funkcji WinAPI GetModuleFileName () . Podaj NULL dla uchwytu modułu, aby uzyskać ścieżkę do bieżącego modułu.
źródło
Pyton
To pobiera ścieżkę do bieżącego modułu.
źródło
Objective-C Cocoa (Mac OS X, nie znam specyfiki iPhone'a):
źródło
W Javie istnieją dwa sposoby znalezienia ścieżki aplikacji. Należy zatrudnić
System.getProperty
:Inną możliwością jest użycie
java.io.File
:Jeszcze inna możliwość wykorzystuje refleksję:
źródło
C:\Program Files\ExampleApp
jest reprezentowany w postaci adresu URL jakofile:/C:/Program%20Files/ExampleApp
, dla którego funkcja getPath () zwraca"/C:/Program%20Files/ExampleApp"
, co oczywiście nie istnieje. Jedynym prawidłowym sposobem konwersji adresu URL do pliku jestnew File(url.toURI())
.W VB6 ścieżkę aplikacji można uzyskać za pomocą
App.Path
właściwości.Zauważ, że nie będzie to miało końca
\
EXCEPT, gdy aplikacja znajduje się w katalogu głównym dysku.W IDE:
źródło
W .Net możesz użyć
System.IO.Directory.GetCurrentDirectory
aby uzyskać bieżący katalog roboczy aplikacji, aw VB.NET konkretnie możesz użyć
My.Application.Info.DirectoryPath
aby uzyskać katalog exe.
źródło
Delphi
W aplikacjach Windows:
W aplikacjach konsolowych:
Niezależnie od języka, pierwszym parametrem wiersza poleceń jest w pełni kwalifikowana nazwa pliku wykonywalnego:
źródło
Libc w
środowisku typu * nix (także Cygwin w Windows):
Zobacz stronę podręcznika
źródło
Unix
W systemie UNIX można znaleźć ścieżkę do pliku wykonywalnego, który został uruchomiony przy użyciu zmiennych środowiskowych. To nie koniecznie ścieżka bezwzględna, więc trzeba by połączyć bieżący katalog roboczy (w powłoce:
pwd
) i / lub zmiennej PATH z wartością elementu 0'th środowiska.Wartość jest jednak ograniczona w systemie UNIX, ponieważ plik wykonywalny można na przykład wywołać za pośrednictwem dowiązania symbolicznego, a dla zmiennej środowiskowej używany jest tylko link początkowy. Ogólnie aplikacje na unixie nie są bardzo solidne, jeśli używają tego do jakichkolwiek interesujących rzeczy (takich jak ładowanie zasobów). W systemie UNIX często używa się miejsc zakodowanych na stałe, na przykład pliku konfiguracyjnego, w
/etc
którym określone są lokalizacje zasobów.źródło
W bash polecenie „pwd” zwraca bieżący katalog roboczy.
źródło
pwd
zwraca bieżący katalog roboczy, który może różnić się od ścieżki skryptu.W PHP :
źródło
w Androidzie jego
aby uzyskać kartę SD, używam
gdzie ten ostatni jest używany do przechowywania określonego typu plików (audio / filmy itp.). Masz stałe dla tych ciągów w klasie Environment.
Zasadniczo do wszystkiego, co ma związek z aplikacją, użyj klasy ApplicationInfo, a do wszystkiego, co ma związek z danymi na karcie SD / katalogu zewnętrznym, używając klasy Environment.
Dokumenty: ApplicationInfo , Środowisko
źródło
W Tcl
Ścieżka aktualnego skryptu:
Ścieżka powłoki Tcl:
Jeśli potrzebujesz katalogu któregokolwiek z tych, wykonaj:
Pobierz aktualny (roboczy) katalog:
źródło
Jawa:
Na wszystkich systemach (Windows, Linux, Mac OS X) działa u mnie tylko to:
źródło
w Rubim poniższy fragment kodu zwraca ścieżkę do bieżącego pliku źródłowego:
źródło
W języku CFML istnieją dwie funkcje dostępu do ścieżki skryptu:
Wywołanie getBaseTemplatePath zwraca ścieżkę do skryptu „podstawowego” - tj. Tego, którego zażądał serwer WWW.
Wywołanie getCurrentTemplatePath zwraca ścieżkę do bieżącego skryptu - tj. Tego, który jest aktualnie wykonywany.
Obie ścieżki są bezwzględne i zawierają pełny katalog + nazwę pliku skryptu.
Aby określić tylko katalog, użyj funkcji
getDirectoryFromPath( ... )
na wynikach.Aby więc określić lokalizację katalogu aplikacji, możesz zrobić:
Wewnątrz
onApplicationStart
wydarzenia dla TwojegoApplication.cfc
Aby określić ścieżkę, w której znajduje się serwer aplikacji, na którym działa silnik CFML, możesz uzyskać dostęp do poleceń powłoki za pomocą cfexecute, więc (mając na uwadze powyższe dyskusje na temat pwd / itp.) Możesz wykonać:
Unix:
w systemie Windows utwórz
pwd.bat
tekst zawierający@cd
, a następnie:(Użyj
variable
atrybutucfexecute
do przechowywania wartości zamiast wyświetlania na ekranie).źródło
W cmd (powłoka wiersza poleceń Microsoft)
Nazwę skryptu można uzyskać za pomocą% * (może być względne w stosunku do pwd)
To dostaje katalog skryptu:
Jeśli znajdziesz jakieś błędy, to na pewno. Następnie napraw lub skomentuj.
źródło
Udostępniłem https://github.com/gpakosz/whereami, który rozwiązuje problem w C i daje:
Używa
GetModuleFileNameW
w systemie Windows, analizuje/proc/self/maps
w systemie Linux i Android i używa_NSGetExecutablePath
lubdladdr
na komputerach Mac i iOS.źródło
Uwaga dotycząca odpowiedzi „20 powyżej tylko w odniesieniu do systemu Mac OSX: Jeśli plik wykonywalny JAR zostanie przekształcony w„ aplikację ”za pośrednictwem pakietu OSX JAR BUNDLER, funkcja getClass (). GetProtectionDomain (). GetCodeSource (). GetLocation (); NIE zwróci wartości bieżący katalog aplikacji, ale doda wewnętrzną strukturę katalogów aplikacji do odpowiedzi. Ta wewnętrzna struktura aplikacji to / theCurrentFolderWhereTheAppReside / Contents / Resources / Java / yourfile
Być może jest to mały błąd w Javie. W każdym razie, aby uzyskać poprawną odpowiedź, należy skorzystać z pierwszej lub drugiej metody, a obie dostarczą poprawną odpowiedź, nawet jeśli aplikacja jest uruchomiona, np. Poprzez skrót znajdujący się w innym folderze lub na pulpicie.
Carl
SoundPimp.com
źródło