- PR -

Vistaでディレクトリ探索でエラー

投稿者投稿内容
じゅり
会議室デビュー日: 2007/06/29
投稿数: 6
投稿日時: 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);
}
}
}
}
}

解決方法をご存じの方おられましたらご教授のほどよろしくお願いします。

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-06-29 16:37
例外のスタックトレースには例外が発生している行数が表示されていると思います。
そこでどのオブジェクトが null になっているのかを突き止めましょう。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-06-29 16:50
JAVA に疎いですが、対象の folder 配下に権限の無い file が存在する場合、Null を返す可能性はあると思います。
# もっとも、同時に security 系の exception 吐くような気がしますけど。

> if (inf.isDirectory()) {

ここで引っかかる?

Vista の場合、user profile の中にも junction 用の file 等、そのままでは読み取りすらできないものがありますから、考慮漏れが顕在化しただけの気がします。

同様なものを作ってやれば 2000 とかでも発生するような気がします。
違うかな?
_________________
じゅり
会議室デビュー日: 2007/06/29
投稿数: 6
投稿日時: 2007-06-29 17:13
インギさん、ちゃっぴさん、早速のレスありがとうございます。

>どのオブジェクトが null になっているのかを突き止めましょう。

これはFile[] infiles が null になります。
そこでCドライブ直下に適当な*.txt ファイルを作成し実行するとそれを表示してからエラーが発生しました。

>Vista の場合、user profile の中にも junction 用の file 等、そのままでは読み取りすらできないものがありますから、考慮漏れが顕在化しただけの気がします。

せっかくご教授いただいたのですがこちらの知識は有していないので解りません。
ごめんなさい。
なにか細工を施さないと駄目ということでしょうか?
なにぶん勉強不足なものでさっぱりどうしたらいいのか解らないしだいです。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-06-29 17:38
引用:

>どのオブジェクトが null になっているのかを突き止めましょう。
これはFile[] infiles が null になります。



あちゃ、ここははずしたか。。。

引用:

そこでCドライブ直下に適当な*.txt ファイルを作成し実行するとそれを表示してからエラーが発生しました。



私の予想が当たっている可能性が高いですね。
%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 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-06-29 17:38
javadocより引用
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/File.html#listFiles()
引用:

戻り値:
  この抽象パス名が示すディレクトリ内のファイルおよびディレクトリを示す抽象パス名の配列。
  配列は、ディレクトリが空の場合は空になる。
  この抽象パス名がディレクトリを示さない場合、または入出力エラーが発生した場合は null


さて、File fはisDirectory()で何を返しますか?
標準APIの挙動に疑問を持ったときはまずjavadocを確認しましょうね。
マーサ
ベテラン
会議室デビュー日: 2004/11/26
投稿数: 87
投稿日時: 2007-06-29 17:40
引用:

じゅりさんの書き込み (2007-06-29 17:13) より:
>どのオブジェクトが null になっているのかを突き止めましょう。

これはFile[] infiles が null になります。
そこでCドライブ直下に適当な*.txt ファイルを作成し実行するとそれを表示してからエラーが発生しました。



アクセス制限の様な気がするのですが。。。
null時の取得しようとしているパスは何になってますか?

[追記]
nagiseさんが書いている通り、ディレクトリ内が空の可能性が大ですね。。。
#何故空なのかは、単純に無いのか、システム的な要因なのか。

[ メッセージ編集済み 編集者: マーサ 編集日時 2007-06-29 18:06 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-06-29 18:18
引用:

マーサさんの書き込み (2007-06-29 17:40) より:
nagiseさんが書いている通り、ディレクトリ内が空の可能性が大ですね。。。
#何故空なのかは、単純に無いのか、システム的な要因なのか。


いや、ディレクトリが空の場合は空の配列、つまり大きさが0の配列が帰るとドキュメントされていますよ。
nullが帰るのは対象のFileがディレクトリではない場合やエラーとなった場合ですので、
私の読みでは「File f」が「適当な*.txt ファイル」なんじゃないかな、と思ってます。

スキルアップ/キャリアアップ(JOB@IT)