質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JAR

JAR(又はJava ARchive)はコンパイルされた複数のJavaバイトコード及び関連ファイルのリソースを一つのファイルに統合したものです。JARファイルはZIPファイルのフォーマットで構築されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

4回答

8701閲覧

jarファイル実行時にフォルダを作成できない現象

orange0190

総合スコア1698

JAR

JAR(又はJava ARchive)はコンパイルされた複数のJavaバイトコード及び関連ファイルのリソースを一つのファイルに統合したものです。JARファイルはZIPファイルのフォーマットで構築されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

2クリップ

投稿2015/07/21 10:46

編集2015/07/21 23:49

いつもお世話になっております。

現在、eclipse4.2を利用して、windows上で動くアプリケーションをjavaを用いて作成しております。
アプリケーションの作成はほぼ完了しており、eclipseでエクスポートを行いjarファイルを作成しました。

そのアプリケーションの機能でiPadからデータが送られてきたら、そのデータをPCに保存するという機能があり、送られてきたデータ別にフォルダを作成し保存するというものです。

上記機能なのですが、eclipe上で動かしていたときに正常に動作していたのですが、jarファイルにしたとたんに不具合を起こすようになりました。

この不具合を回避したいのですが、何か情報をいただけないでしょうか。

[発生した不具合]
ディレクトリの作成ができない
ecliple上で動かしたときはログに「directory success」と記録されるが、jarファイルから実行したときには「directory failed」と記録される。

java

1 File uploadDir = new File(作成するディレクトリのパス); 2if(!uploadDir.exists() || !uploadDir.isDirectory()){ 3 uploadDir.delete(); 4 if(uploadDir.mkdirs()){ 5 Log.output("directory success"); 6 } else { 7 Log.output("directory failed"); 8 } 9}

[環境]
java : 1.8.0_51
OS : windows7 64bit

[追記]
パーミッションには、問題はなさそうと思っていますが、正直わかりません。

[修正]
ファイル削除の処理があったのを、書き忘れていました。
修正しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2015/07/21 14:08

!uploadDir.exists() || !uploadDir.isDirectory() この条件式は何を意図したものですか?
orange0190

2015/07/21 14:14

uploadDirが存在していないか、存在していてもそのファイルがディレクトリではない場合を示しています。
guest

回答4

0

ベストアンサー

Invalid file pathが出てくるという事はパスに初期文字が含まれているという事になります。
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/io/File.java#File.isInvalid%28%29

コードを見る限り、パスに初期文字が含まれていてもuploadDir.mkdirs()までたどり着きそうです。

File uploadDir = new File(作成するディレクトリのパス);
「作成するディレクトリのパス」をログ出力してみてはいかがでしょうか。

投稿2015/07/22 03:57

chiku_

総合スコア1464

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orange0190

2015/07/22 04:02

回答ありがとうございます。 作成するディレクトリのパスは「C:\Users\ユーザ名\Desktop\ディレクトリ1\ディレクトリ2\対象ディレクトリ」となります。 こちらは個人情報等を含んでいるため、実際のパスではありませんが、実際にはこのパスは半角英数字とハイフンで構成されています。
chiku_

2015/07/22 04:30

うーん、後はMakotoMiyazakiさんが言われているようにエンコードが原因のように思います。 コンパイルと実行時両方で文字コードを指定するなど。。 http://d.hatena.ne.jp/Syo-Takasaki/20090331/1238431741 解決策ではないですが、作成するディレクトリのパスからnull文字をreplaceしてやれば、ディレクトリの作成は可能になると思います。 作成するディレクトリのパスにどの段階でnull文字が設定されるかなど調べられたら、解決の糸口になるかもしれません。 後、eclipseでコーティングしているとjavaファイル自体に何かの拍子で変な文字コードが入ってしまう事があります。jar化にした時にだめという事なので、本件とは関係ないとは思いますが。。
orange0190

2015/07/22 04:47

正しい解決法ではないのかもしれないですが、以下のようにすることでなおりました。 どうやら「\u0000」が含まれていたようです。ログ出力時に見えないので、気づきませんでした。 String targetPath = 作成するディレクトリのパス; targetPath = targetPath.replaceAll("\u0000", ""); File uploadDir = new File(targetPath); if(!uploadDir.exists() || !uploadDir.isDirectory()){ uploadDir.delete(); if(uploadDir.mkdirs()){ Log.output("directory success"); } else { Log.output("directory failed"); } } >Invalid file pathが出てくるという事はパスに初期文字が含まれているという事になります。 まさにこの通りでした。ありがとうございました。非常に助かりました。
guest

0

Fileのmkdirsの内部実装は

java

1 if (exists()) { 2 return false; 3 } 4 if (mkdir()) { 5 return true; 6 } 7 File canonFile = null; 8 try { 9 canonFile = getCanonicalFile(); 10 } catch (IOException e) { 11 return false; 12 } 13 14 File parent = canonFile.getParentFile(); 15 return (parent != null && (parent.mkdirs() || parent.exists()) && 16 canonFile.mkdir());

こんな感じになってます。

falseの原因となりうるのは
1.file.exists() が true
2.getCanonicalFile();で IOExceptionが出る。
3.parentのmkdirs()に失敗した。
4.canonFileのmkdir()に失敗した。
のいずれかです。

今回の場合、1.のfile.exitsはおそらくfalseなので1は除外するとして
残りのどれが原因かを特定してみてください。

投稿2015/07/22 00:57

MakotoMiyazaki

総合スコア297

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orange0190

2015/07/22 01:39

2.の時点で失敗しているようです。 何か回避策はありますでしょうか?
MakotoMiyazaki

2015/07/22 02:06

IOExceptionの内容はわかりますか?
orange0190

2015/07/22 03:08

Invalid file pathとでていますが、パスには問題ないように見受けられます。
MakotoMiyazaki

2015/07/22 03:21

ん~・・・Invalid file pathが発生するのは、pathがnullの場合なんですが pathがnullになる可能性としては、そもそもpathにnullを渡している場合と 相対パスをファイルシステムがnormalizeするのに失敗した場合です。 例えば、相対パスを ("../../tmp") の様に指定していた場合 eclipseからの起動であれば、参照先がeclipseのworkspaceからの相対になりますが jarをコマンドプロンプトから起動した場合、実行ディレクトリからの相対になります。 この時、実行ディレクトリがC直下とかだと、2階層上は存在しないのでpathがnullになります。 作成するディレクトリのパスは相対パスを指定してますか?絶対パスですか? もし、相対パスなら絶対パスにしてみてください。
orange0190

2015/07/22 03:49

渡しているパスは「C:\Users\ユーザ名\Desktop\ディレクトリ1\ディレクトリ2\対象ディレクトリ」といった形になります。 対象ディレクトリまでの各ディレクトリは存在していることが確認済みです。
MakotoMiyazaki

2015/07/22 03:55

あとは、可能性としてはエンコードの問題で、パスを読み込む際に文字化けしてしまってる、ぐらいですかね… 例えば、ファイルをUTF-8で保存してコマンドプロンプトで実行すると デフォルトだとShift-JISなので、文字化け状態になるはずです。 試しに、パスを全部半角英数にするか、java -jar -Dfile.encoding=UTF-8 ○○○.jar の様にエンコード指定でjarを起動してみてもらえますか?
orange0190

2015/07/22 04:19 編集

示したパスは個人情報や仕事上の情報を含むため実際のパスではありませんが、実際のパスはすべて半角英数字とハイフンとなっています。
MakotoMiyazaki

2015/07/22 04:22

おそらく、コンストラクタで渡されたpathをjava.io.FileSystemのnormalizeで変換すると 初期文字が含まれる値になっている、という状態だとは思うのですが、なぜそうなってるのかはわからないですね… uploadDir.getPath()で取得した値をログ出力してみたらどういう値になってるでしょうか?
VIRTUE

2015/07/22 04:46

2. まで処理が行っているのであれば、少なくとも1回は mkdir() が false を返してますよね。 ひとまず、親ディレクトリを再帰的に作成させる必要が無い状態にして、mkdirs() ではなく mkdir() を使ってみて、挙動を確認してみてはいかがでしょうか。 それで問題が解消するようであれば、ファイルシステムの都合かもしれません。
orange0190

2015/07/22 04:57

MakotoMiyazakiさん、Leihcrevさん 回答、コメントありがとうございます。 >初期文字が含まれる値になっている まさにこの通りでした。 なぜ、jarにすると動作しなくなるかは分かりませんでしたが、chiku_さんに教えていただいた情報を元に無事解決することができました。 ご協力ありがとうございました。大変助かりました。
guest

0

まったく的外れかもしれませんが、以下の2点が気になります。

・META-INF/MANIFEST.MF の Permissions

Permissions: sandbox

となっていたり、何も書かれていなかったりするのであれば、

Permissions: all-permissions

と書いてみてください。

・jar ファイルの置き場所
ネットワーク上の共有フォルダに jar を置いて実行しているのであれば、ローカルディスク上に jar を置いて実行してみてください。

投稿2015/07/22 04:08

VIRTUE

総合スコア39

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orange0190

2015/07/22 04:15

・MANIFEST.MF MANIFEST.MFには、「Permissions: all-permissions」と記述されています。(eclipseで確認) ・jarファイルの置き場所 ローカルディスク上に置いてあります。
guest

0

単純に、ディレクトリではないuploadDirが既に存在しているのでは?

投稿2015/07/21 14:18

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orange0190

2015/07/21 23:46

そういうことはありません。 存在していないことは確認済みです。 また、省略していましたが、ディレクトリでないuploadDirが存在している場合にはそれを削除する処理が、実は存在します。 質問を修正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問