pełna ścieżka do pliku z programem - niezależnie od miejsca wywołania

pełna ścieżka do pliku z programem - niezależnie od miejsca wywołania
NI
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 13 lat
0

Mam pewien niebanalny problem. Otóż przy starcie mojej aplikacji pobieram ścieżkę, gdzie znajduje się program i zapisuję go do Stringa, z którego potem korzystam do zapisywania/odczytywania plików w aplikacji.

Jeśli użytkownik uruchamia aplikację z katalogu gdzie jest ten program to nie ma problemu, ale gdy znajduje się w innej lokalizacji i uruchomi program podając pełną ścieżkę do niego to dostaję nie ten wynik co trzeba.

Np.:

User jest w katalogu C:\

wpisze: C:\katalog_z_programem\uruchom.bat

To aplikacja się uruchomi, ale ścieżka do katalogu z aplikacją będzie mieć postać:
C:
zamiast:
C:\katalog_z_programem\

W Linuksie jest ten sam problem. Wiecie może jak to rozwiązać?


Od razu powiem, że próbowałem standardowych rozwiązań, typu:

Kopiuj
 URL pUrl1 = NazwaKlasy.class.getClassLoader().getResource("NazwaKlasy.class"); 

Kopiuj
 URL pUrl12 = NazwaKlasy.class.getResource(".");

Kopiuj
 File katalog = new File(Jaspresso.class.getProtectionDomain().getCodeSource().getLocation().getPath()); 

Kopiuj
 File katalog=new File("");
String s =katalog.getAbsolutePath();

I nic nie działało jak należy, każdy ze sposobów wykładał się, gdy użytkownik uruchamia aplikację z innej lokalizacji podając właściwą ścieżkę do programu w konsoli.

edytowany 2x, ostatnio: _nick_
0

A co zawiera plik uruchom.bat? Zapewne wystarczy jak w tym pliku będzie polecenie cd wymagany_katalog.

NI
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 13 lat
0

Od razu zaznaczyłem, że to nie chodzi o tak banalne rzeczy, z 3 programistami się nad tym zastanawiamy :D

bat jest w tym samym katalogu co jar i ma treść:

java -jar MOJ_JAR.jar

z resztą użytkownik pod linuksem np. może to wywołać tak, że jest w \usr\local\ a wywoła aplikację która jest w \home.

Podkreślam jeszcze raz, że to nie działa TYLKO, gdy user jest w innej lokalizacji niż program i poda ścieżkę do aplikacji w konsoli.

bogdans
Jednak chodzi o tak banalne rzeczy. z 3 programistami się nad tym zastanawiamy =>tym razem ilość nie przeszła w jakość.
0

Moze to sie przyda (bash). Nie wiem jak pod windowsem, w zyciu nie napisalem ani jednego pliku bat...

ME="$0"
DIRNAME=$(dirname $ME)
pushd "$DIRNAME" &> /dev/null
DIRNAME=$(pwd)
popd &> /dev/null
BASENAME=$(basename $ME)
ABSOLUTE_ME=$DIRNAME/$BASENAME
echo $ABSOLUTE_ME

jak to umiescisz w pliku sh i uruchomisz ten plik z obojetnie jakiego miejsca, powinien wypluc pelna sciezke do siebie. Dalej juz powinienes sobie poradzic?

0

Coś kręcisz, przy takim pliku BAT program MOJ_JAR.jar z katalogu katalog_z_programem się w ogóle nie uruchomi. Jeżeli zmienna CLASSPATH zawiera katalog z plikiem MOJ_JAR.jar, to uruchomi się ten program MOJ_JAR.jar z tego katalogu, jeśli nie zawiera, to pojawi się komunikat Unable to access jarfile ....

XA
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:18
0

Wygooglowałem kiedyś, powinno działać:

Kopiuj
java.security.CodeSource source = this.getClass().getProtectionDomain().getCodeSource();
java.net.URI uri = new java.net.URI(source.getLocation().toString());
java.io.File f = new java.io.File(uri);

UWAGA: Działa tylko jak uruchomi się z jara (można niebezpośrednio, ważne żeby był jar).

0

Napiszę jeszcze raz. Jeżeli użytkownik wpisze C:\katalog_z_programem\uruchom.bat, katalogiem bieżącym nie jest katalog_z_programem, a plik uruchom.bat ma zawartość

Kopiuj
java -jar MOJ_JAR.jar

to nie zostanie uruchomiony MOJ_JAR.jar z katalogu katalog_z_programem. Co więcej, JVM (i uruchomiony JAR, trzeba mieć ogromne szczęście by jakiś się w ogóle uruchomił)
nie ma pojęcia o tym co wpisał użytkownik. Zatem żadne sztuczki, wygóglane skrypty i modły do Allacha nie wyświetlą katalogu katalog_z_programem.

NI
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 13 lat
0

Aplikacja uruchamia się za każdym razem :)

Problem polega na tym, że na początku jak startuje aplikacja, w main() odczytuję kilka plików, które są niezbędne do dalszego działania programu. Do tego potrzebuję właśnie ścieżki do katalog_z_programem. Ścieżka względna w opisywanym przeze mnie w tym temacie przypadku nie zadziała, tak samo jak pobieranie bezwzględnej przez pozostałe sposoby które podałem.

Nie ma na to jakiegoś sposobu? JVM na pewno zna ścieżkę do programu, da się ją jakoś wydobyć?

0

Pomyśl trochę, jesteś w katalogu C:\test, wpisujesz na konsoli C:\katalog_z_programem_\uruchom.bat, SO wykonuje polecenia z podanego pliku wsadowego (katalogiem bieżącym jest nadal C:\test). Plik wsadowy zawiera jedno polecenie java -jar moj_jar.jar, jakim cudem JVM ma się domyślić, że chodzi o plik jar z katalogu katalog_z_programem? Nie może się domyślić, typową reakcją jest komunikat Unable to access jarfile ..., uruchomienie się programu oznacza, że w katalogu C:\test jest plik moj_jar.jar. Być może (nie mogę znaleźć tego w dokumentacji), JVM przegląda pewne katalogi w poszukiwaniu pliku moj_jar.jar. Wtedy uruchomi się jakiś przypadkowy jar.

NI
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 13 lat
0

Wszystko uruchamia się dobrze, bo użytkownik podaje pełną ścieżkę do bata i nie ma problemu - działa to na każdym systemie, więc nie wiem co się tak dziwisz.

Czyli uważasz, że nie da się tego zrobić z poziomu kodu Java?

0

Pełna ścieżka do bata nie ma żadnego znaczenia. JVM nic nie wie o tym co wpisał użytkownik w konsoli. To, że wyświetlany jest katalog *C:* sugeruje, że uruchamia się jar,
który jest w katalogu *C:*. Twoje przeświadczenie, że uruchamia się jar z katalogu katalog_z_programem jest błędne.

0

Dziwię się, bo nie ma prawa działać. I na wszystkich systemach, które sprawdziłem (windows i linux) nie działa, tzn JVM wyświetla komunikat Unable to access jarfile ....
Uruchamiam batcha (skrypt) z innego katalogu podając pełna nazwę batcha (skryptu), w katalogu z batchem (skryptem) jest plik jar.

R7
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 13 lat
0

Problem w tym, ze niepotrzebnie pobierasz sciezke bazowa. Bo w tym momencie pobierany jest userdir czyli aktualny katalog, w ktorym pracuje uzytkownik. Przez to sciezka sie nie zgadza.

Kopiuj
 
private BufferedImage Img;
private String ImgSciezka = "img/obrazek.jpg";
...
try {
      Img = ImageIO.read(new File(ImgSciezka));
} catch (IOException ex) { }

W ten sposob jezeli, w katalogu w ktorym jest ten .jar, masz katalog img/obrazek.jpg to wczyta go bez problemu.

0

@rucio71, problem w tym, że nie masz pojęcia o czym piszesz.
Kod

Kopiuj
private String ImgSciezka = "img/obrazek.jpg";
...
try {
      Img = ImageIO.read(new File(ImgSciezka));
} catch (IOException ex) { }

korzysta z adresu względnego względem katalogu bieżącego a nie względem katalogu, w którym jest jar. Jeśli katalogiem bieżącym jest katalog jajo,
jar znajduje sie w katalogu kura, a obrazek jest w pliku kura/obrazek.jpg, to po wpisaniu na konsoli polecenia java -jar kura/nazwa_jara
obrazek nie zostanie wczytany.

R7
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 13 lat
0

No ale problem, który przedstawiles w pierwszym poscie jest taki, ze jak uruchamiasz z C:\ plik C:\katalog\uruchom.bat. Ja sprawdzilem u siebie czy dziala metoda, o ktorej napisalem nim wrzucilem posta. I w wypadku uruchamiania programu w sposob opisany w Twoim pierwszym poscie, ten sposob, ktory opisalem uruchamia sie i wczytuje obrazki.

0

Jeżeli plik wsadowy uruchom.bat zawiera tylko jedno polecenie java -jar pełna_nazwa_jara, w momencie uruchomienia pliku wsadowego katalogiem bieżącym nie jest katalogiem z jarem i katalog bieżący nie zawiera podkatalogu img z plikiem obrazek.jpg, to Twój kod nie wyświetli obrazka.

bogdans
Obrazek się wyświetli jeśli jar przed odczytaniem pliku z obrazkiem zmienia katalog bieżący.
R7
A ja Ci mowie ze ten sposob dziala. Jezeli sprawdziles i nie dziala to jeszcze cos jeszcze musisz robic zle.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)