• ベストアンサー

プログラムから起動ディレクトリを知るには?

Jar または class 自身が起動したディレクトリをプログラム内から取得したいのですが、どうすればよいでしょう? つまり、C の argv[0] にあたる絶対ディレクトリパスを取得したいのです。.jar と同じディレクトリに .properties などを置いて、保存・読み込みするようにするのが目的です。

  • Java
  • 回答数4
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.4

 こんにちは。  deadlockさんの方法を参考にサンプルを作ってみました。  でも、複雑でトリッキーになってしまいました。  もっと、シンプルな方法があればいいのですが・・・。 (コンパイルするときは、全角スペースを半角スペースに変換してからにしてください) package hoge.hoge; import java.net.*; import java.io.*; import java.util.regex.*; public class Test {   public static void main(String[] args){     Test test = new Test();     Class testClass = test.getClass();     //リソースとして自分自身を探す。これなら、間違いなくあるはず。     URL url = testClass.getResource("Test.class");          File dir = null;          String protocol = url.getProtocol();          //Jar化されている場合は、     if (protocol.equals("jar")) {              //URLの要らない部分を取って、       Pattern p = Pattern.compile("(file:/.*)!/");       Matcher m = p.matcher(url.toString());       if (!m.find()) {         System.out.println("find失敗");         System.exit(1);       }              //Jarファイルの場所を特定し、       File jarFile = null;       try {         jarFile = new File(new URI(m.group(1)));       }       catch (URISyntaxException ex) {         ex.printStackTrace();         System.exit(1);       }              //その親ディレクトリ。       dir = jarFile.getParentFile();     }          //Jar化されていない場合は、     else if (protocol.equals("file")) {              //クラスファイルの場所を特定し、       File classFile = null;       try {         classFile = new File(new URI(url.toString()));       }       catch (URISyntaxException ex) {         ex.printStackTrace();         System.exit(1);       }              Package pack = testClass.getPackage();              //無名パッケージの場合は、       if (pack == null) {                  //その親ディレクトリ。         dir = classFile.getParentFile();       }              //パッケージ名がある場合は、       else {                  //パッケージの階層の分だけ上に上がる。         String packName = pack.getName();         String[] words = packName.split("\\.");         dir = classFile.getParentFile();         for (int i = 0; i < words.length; i++) {           dir = dir.getParentFile();         }       }     }     else {       System.out.println("Fileオブジェクトにできません");       System.exit(1);     }     System.out.println(dir);   } }

hemlock
質問者

お礼

こんにちは。わざわざプログラムを作っていただきありがとうございます。これで目的に到達できそうです。 Jar でも使えるとは思っていませんでした。方法が色々あるもの、と勉強になりました。

その他の回答 (3)

noname#49664
noname#49664
回答No.3

これ、プラットフォーム(OS)によっては動作が違うのかもしれませんが・・。 File f = new File("Sample.class"); String fpath = f.getAbsolutePath(); これで、絶対パスが得られませんか?  基本的にファイル名だけを指定してFileを取得すると、起動クラスがあるディレクトリ内からそれを探してFileを得ることができますよね? ならば、起動クラス(またはJar)のファイル自身のFileを作ってgetAbsolutePathすれば得られるように思いますが・・。  これでもしうまくいくなら、後はそこからディレクトリのパスを得るのは簡単でしょう。

hemlock
質問者

お礼

ありがとうございます。 Windows 上で試してみたのですが、 new File(name) したときに name が絶対パスで与えられていない場合、 Java は name が実在する/しないに関わらず、カレントディレクトリにある、と想定するようです。で、getAbsolutePath() は Java コマンドをたたいたディレクトリが返ってきて、起動クラスがあるディレクトリにはなりませんでした。 これはいけそうかと自分も思いましたが、、残念です。

  • deadlock
  • ベストアンサー率67% (59/87)
回答No.2

Classファイルなどの絶対パスとは異なりますが、 Class#getResource(String) Class#getResourceAsStream(String) を使用されてはどうでしょう。クラスパス内からリソース(この場合、.propertiesファイル)を 取得できます。 public class Foo { public static void main(String[] args) throws IOException { InputStream in = Foo.class.getResourceAsStream("hoge.properties"); Properties prop = new Properties(); prop.load(in); prop.list(System.out); } } として、指定したプロパティファイルを以下のディレクトリ構成になるように配置してください。 ┣Foo.class ┗hoge.properties ※「クラスパスから探す」なので、クラスパス上であればほかの場所でもかまいません。  ただ、最初の動作確認のときは同じところに置いた方が分かりやすいでしょう。

hemlock
質問者

お礼

ありがとうございます。設定ファイルを .class と同じ場所に置ける、という意味ではこの方法がよさそうですね。絶対パスについては、VM にアクセスするしか判別方法はないのかも知れません。。

回答No.1

System.getProperty("user.dir"); で取得できます。 いや、そういうと語弊が…。 javaコマンドを叩いたディレクトリが取得できますね。 D:\hoge1>java hogepackage.hoge とすると D:\hoge1 というディレクトリが取得できます。 でも起動したクラスの場所は D:\hoge1\hogepackage となりますよね。 参考になれば幸いです。

hemlock
質問者

お礼

ありがとうございます。システムプロパティは一通り漁ってみたのですが、user.dir は起動したカレントディレクトリになってしまいますね。 C:\user>java -jar c:\bin\foo.jar としたときに、foo.jar のプログラム中で c:\bin を取得したいです。

関連するQ&A

  • Classの起動パスの取得方法

    Javaで public static void main( String args[] ) が呼び出されたとき、Cであればargv[0]に 自身の起動パスが設定されていますが、 JavaではArgs[0]は1番目の引数が入るだけなので その目的には使えないようです。 起動されたClassファイルが置かれているパス を知る方法を教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • C#でカレントディレクトリの取得方法について

     自作の.exeファイルの置かれているディレクトリ場所を  取得するプログラムを作成したく思います・  自作exeファイルのディレクトリ構造は、「*:*/hoge/plugin/自作.exe」です。  この時、一個上のディレクトリを参照して、ディレクトリパスを取得する  方法などがありましたらおしえて頂きたく思います。  ちなみに、以下のプログラムではできなかったのですが、参考までに載せました。  よろしくお願いします。  string stParentName = System.IO.Path.GetDirectoryName(@"*:*/hoge/plugin/自作.exe"); MessageBox.Show(stParentName);

  • ディレクトリの作成

    今自作プログラムをつくっている大学生です。 C++で、ファイルの作成、ファイルからの書き込み、読み込みは、ifstream,ofstreamを使ってできるのですが、UNIXで、プログラム内での操作で新しいディレクトリを作りたいと思っているのですが、どうやったらいいかわかりません。 知っている方がいたら、書式等なるべく詳しく教えて下さい。よろしくお願いします。

  • log4jを使用し、JAVAのバッチプログラムを作っております。

    log4jを使用し、JAVAのバッチプログラムを作っております。 ○ディレクトリ構成は、 test - pack1   - ※1     - pack2   - ※2     - resources - ※3     - lib    - ※4  ※1:メインプログラム  ※2:この中でPropertyConfiguratorを使用し、log4j.propathiesを読み込んでいる。 ( PropertyConfigurator.configure("resources/log4j.properties"); )  ※3:log4j.properties  ※4:log4j-1.2.8.jar ○悩み testのディレクトリから java -cp .;lib\log4j-1.2.8.jar pack1.Aaa の場合、うまくいくのですが、testの一つ上のフォルダから java -cp test;test\lib\log4j-1.2.8.jar pack1.Aaa  と行うと以下のエラーが出ます。 log4j:ERROR Could not read configuration file [resources/log4j.properties]. java.io.FileNotFoundException: resources\log4j.properties (指定されたパスが見つかりません。) at java.io.FileInputStream.open(Native Method)         ・        ・        ・ ○質問 よくネットで原因を検索するとパスを通せば問題ないと書かれていますが、どのようにパスを通せばよいのでしょうか?

    • ベストアンサー
    • Java
  • jarファイルの起動方法

    クラスファイルと画像をjarファイルに固めてクリックで起動したいのですができません。正確に言うと、最初の2~3回はできていたのですが、何回かプログラムを修正せいているうちにjarに固めてクリックしても起動しなくなりました。  マニフェストファイルは、 Main-Class: MainWindow(この後改行) です。 jarファイルへの固め方は、testフォルダにclassファイルと画像ファイルがあるものとして、 cd C:\test C:\j2sdk1.4.2_05\bin\jar cf kakei.jar *.class *.PNG C:\j2sdk1.4.2_05\bin\jar ufm kakei.jar manifest.txt です。 プログラム内の画像のロード方法は、 MediaTracker tracker=null; Image images=null; try{ tracker=new MediaTracker(this);//画像の取り込み tk=Toolkit.getDefaultToolkit(); URL img=getClass().getResource("img1.PNG"); images=tk.createImage(img); tracker.addImage(images,0,93,28); } catch(Excetption e){} 最初の2~3回はこの方法できちんと実行できました。また、ほかのアプリケーションもこの方法でやっていましたがうまくいきます。画面にまったく表示されませんが実行後にjarファイルを削除できないので おそらく実行はされているのだと思います。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • ディレクトリについて

    Cをはじめたばかりの初心者です。 ディレクトリについてわからないことがあります。 まずコマンドプロンプト上でbofileというディレクトリを作ってその中にさらにmenu01というディレクトリをつくろうと思い C:\bofile>md \menu01 C:\bofile>cd \menu01 C:\menu01 とやっていったのですがmenu01フォルダは,なぜかbofileディレクトリの外にできてしまいます。とりあえず無視してbofileのなかにmenu01というプログラムを作ってそのあとmenu01フォルダをbofileに移して作ったプログラムをそのmenu01フォルダに移動させて コマンドプロンプト上で C: \bofile>cd \menu01 のようにやったのですが、 The system cannot find the path spedified. と表示されてしまいます。 menu01プログラムはbofileに裸でおいといたときはエラーもなくきちんと起動しました。しかしmenu01フォルダにいれてからは 上記のメッセージが出てしまい、どうしようもありません。説明に不足があれば、また足しますので、どうかよろしくお願いします。

  • サーブレットとJSPのディレクトリ指定について

    現在WebサーバーとしてTomcatを使用しているのですが、題記の通り質問があります。 JSPのディレクトリ構成は C:\Program Files\Apache Tomcat 4.0\webapps\(JSPを保存するディレクトリ) というようにwebappsのしたにディレクトリを作成しました。 JSPからサーブレットを呼ぶために、 現在は C:\Program Files\Apache Tomcat 4.0\webapps\(JSPを保存するディレクトリ) \WEB-INF\classesディレクトリに格納しています。 できれば、sevletディレクトリを作りわかりやすい構成にしたいのですが、 そのようにやることはできるのでしょうか?

  • jarファイルの起動方法

    jarファイルを作成して、ダブルクリックで起動できる ようにしたいのですが、作成したjarファイルをクリックしても何の反応もありません。エラーメッセージが 出るわけでもなく、ただ、プログラムが実行されないのです。jarファイルの作成過程は以下のとおりです。 jar cf temp.jar testclass.class jar ufm temp.jar manifest.txt マニフェストファイルの最後には改行をいれてあります。

    • ベストアンサー
    • Java
  • apacheのDirectory指示子でわからない

    Windows2000pro,apache2.0.55です。 Directory指示子の使い方がいまいちわかりません。 あるディレクトリ(たとえばtest)にForceType指示子で強制的にMIMEを設定したいのですが、 <Directory "C:Program Files/Apache Group/Apache2/htdocs/test"> ForceType image/gif </Directory> と直接絶対パスで指定するとうまくいくのですが、 <Directory /htdocs/test> ForceType image/gif </Directory> と/からの相対パスにするとうまくいかないのです。 手元の解説書によると、Directory指示子での/とはServerRoot指示子で指定されたディレクトリを指す、とあります。 ServerRoot指示子の値は "C:Program Files/Apache Group/Apache2" となっています。 ということは <Directory /htdocs/test> という指定で <Directory "C:Program Files/Apache Group/Apache2/htdocs/test"> と同じ意味になるはずなのですが、そうはなっていないのです。 どこがまずいのでしょうか? よろしくお願いいたします。

  • ディレクトリ以下のファイル名を取得する

    ディレクトリ名を指定するだけで、 そのディレクトリ内にある全てのデータファイルを 読み込んで処理するプログラムをC++で作ろうと考えています。 その為に、ディレクトリ以下のファイルのファイル名を 取得する方法(命令)を教えて頂きたく思います。 よろしくお願いします。

専門家に質問してみよう