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

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

ただいまの
回答率

87.79%

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 7,129

score 1623

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

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

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

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

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

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

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

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

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

[修正]
ファイル削除の処理があったのを、書き忘れていました。
修正しました。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Stripe

    2015/07/21 23:08

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

    キャンセル

  • orange0190

    2015/07/21 23:14

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

    キャンセル

回答 4

checkベストアンサー

+4

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 13:02

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

    キャンセル

  • 2015/07/22 13:30

    うーん、後はMakotoMiyazakiさんが言われているようにエンコードが原因のように思います。

    コンパイルと実行時両方で文字コードを指定するなど。。
    http://d.hatena.ne.jp/Syo-Takasaki/20090331/1238431741

    解決策ではないですが、作成するディレクトリのパスからnull文字をreplaceしてやれば、ディレクトリの作成は可能になると思います。

    作成するディレクトリのパスにどの段階でnull文字が設定されるかなど調べられたら、解決の糸口になるかもしれません。

    後、eclipseでコーティングしているとjavaファイル自体に何かの拍子で変な文字コードが入ってしまう事があります。jar化にした時にだめという事なので、本件とは関係ないとは思いますが。。

    キャンセル

  • 2015/07/22 13: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が出てくるという事はパスに初期文字が含まれているという事になります。
    まさにこの通りでした。ありがとうございました。非常に助かりました。

    キャンセル

+2

Fileのmkdirsの内部実装は
        if (exists()) {
            return false;
        }
        if (mkdir()) {
            return true;
        }
        File canonFile = null;
        try {
            canonFile = getCanonicalFile();
        } catch (IOException e) {
            return false;
        }

        File parent = canonFile.getParentFile();
        return (parent != null && (parent.mkdirs() || parent.exists()) &&
                canonFile.mkdir());
こんな感じになってます。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/22 13:22

    おそらく、コンストラクタで渡されたpathをjava.io.FileSystemのnormalizeで変換すると
    初期文字が含まれる値になっている、という状態だとは思うのですが、なぜそうなってるのかはわからないですね…

    uploadDir.getPath()で取得した値をログ出力してみたらどういう値になってるでしょうか?

    キャンセル

  • 2015/07/22 13:46

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

    キャンセル

  • 2015/07/22 13:57

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

    キャンセル

+1

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

・META-INF/MANIFEST.MF の Permissions
Permissions: sandbox
となっていたり、何も書かれていなかったりするのであれば、
Permissions: all-permissions
と書いてみてください。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/22 13:15

    ・MANIFEST.MF
    MANIFEST.MFには、「Permissions: all-permissions」と記述されています。(eclipseで確認)

    ・jarファイルの置き場所
    ローカルディスク上に置いてあります。

    キャンセル

-2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/22 08:46

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

    キャンセル

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

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る