- - PR -
Vistaでディレクトリ探索でエラー
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-06-29 16:10
初めまして、じゅりと申します。
現在ローカルの検索ソフトを作る過程においてディレクトリ及びファイルの情報取得でトラブってます。 再帰的構造プログラムで検索対象にマッチするファイルのパスを取得するだけなんですが OS Windows Vista 64bit Ultimate JDK 1.6u1(64bit 及び 32bit) 開発環境 NetBeans5.5 日本語版 上記環境でException in thread "main" java.lang.NullPointerException といったエラーがでます。 しかし、 WindowsXP(32bit) JDK 1.6u1 では期待通りの動作をしてくれます。 日経ソフトウェア8月号の「誰でも使えるJava」という連載記事にちょうどビンゴな内容の記事があったので試してみました。 やはりVistaではエラーがでます。 コードは下記のとおりです。 注)c:\\temp のところは c:\\ に置き換えて実行してます。 import java.io.File; public class FindFiles { public static void main(String[] args) { File dir = new File("c:\\temp"); listPath(dir); } private static void listPath(File f) { File[] infiles = f.listFiles(); for (File inf : infiles) { if (inf.isDirectory()) { listPath(inf); } else { String name = inf.getAbsolutePath(); if (name.contains("txt")) { System.out.println(name); } } } } } 解決方法をご存じの方おられましたらご教授のほどよろしくお願いします。 | ||||||||
|
投稿日時: 2007-06-29 16:37
例外のスタックトレースには例外が発生している行数が表示されていると思います。
そこでどのオブジェクトが null になっているのかを突き止めましょう。 | ||||||||
|
投稿日時: 2007-06-29 16:50
JAVA に疎いですが、対象の folder 配下に権限の無い file が存在する場合、Null を返す可能性はあると思います。
# もっとも、同時に security 系の exception 吐くような気がしますけど。 > if (inf.isDirectory()) { ここで引っかかる? Vista の場合、user profile の中にも junction 用の file 等、そのままでは読み取りすらできないものがありますから、考慮漏れが顕在化しただけの気がします。 同様なものを作ってやれば 2000 とかでも発生するような気がします。 違うかな? _________________ | ||||||||
|
投稿日時: 2007-06-29 17:13
インギさん、ちゃっぴさん、早速のレスありがとうございます。
>どのオブジェクトが null になっているのかを突き止めましょう。 これはFile[] infiles が null になります。 そこでCドライブ直下に適当な*.txt ファイルを作成し実行するとそれを表示してからエラーが発生しました。 >Vista の場合、user profile の中にも junction 用の file 等、そのままでは読み取りすらできないものがありますから、考慮漏れが顕在化しただけの気がします。 せっかくご教授いただいたのですがこちらの知識は有していないので解りません。 ごめんなさい。 なにか細工を施さないと駄目ということでしょうか? なにぶん勉強不足なものでさっぱりどうしたらいいのか解らないしだいです。 | ||||||||
|
投稿日時: 2007-06-29 17:38
あちゃ、ここははずしたか。。。
私の予想が当たっている可能性が高いですね。 %SYSTEMDRIVE% 直下には、通常の user からでは読み取りすらできない file がありますので。 昇格した command prompt で "DIR /A" と icacls.exe で調査してみましょう。 あと、対象の code を実行する際に process monitor で trace とってみましょう。 access deny 食らっているものあると思いますよ。 しかし、私の予想が正しいとすると " for (File inf : infiles) {" ここで java.lang.NullPointerException 食らうというのは JRE の実装間違っていないかい? その部分で java.lang.NullPointerException が発生するのを無視するようにするしか対応は無いんじゃないでしょうかね? _________________ ちゃっぴ@わんくま同盟 ちゃっぴの監禁部屋 [ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2007-06-29 17:41 ] | ||||||||
|
投稿日時: 2007-06-29 17:38
javadocより引用
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/File.html#listFiles()
さて、File fはisDirectory()で何を返しますか? 標準APIの挙動に疑問を持ったときはまずjavadocを確認しましょうね。 | ||||||||
|
投稿日時: 2007-06-29 17:40
アクセス制限の様な気がするのですが。。。 null時の取得しようとしているパスは何になってますか? [追記] nagiseさんが書いている通り、ディレクトリ内が空の可能性が大ですね。。。 #何故空なのかは、単純に無いのか、システム的な要因なのか。 [ メッセージ編集済み 編集者: マーサ 編集日時 2007-06-29 18:06 ] | ||||||||
|
投稿日時: 2007-06-29 18:18
いや、ディレクトリが空の場合は空の配列、つまり大きさが0の配列が帰るとドキュメントされていますよ。 nullが帰るのは対象のFileがディレクトリではない場合やエラーとなった場合ですので、 私の読みでは「File f」が「適当な*.txt ファイル」なんじゃないかな、と思ってます。 |