- - PR -
Vistaでディレクトリ探索でエラー
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-06-29 18:27
読み返してみるとその可能性が大ですね。 Vista から従来と異なる方法での junction が加わったわけですが、その扱い java ではどうなるんですかね?
想定していなければ、そうなるような気がします。 [追記] Junction Points in Windows Vista and Longhorn Server [/追記] ということは "for (File inf : infiles) {" の前で null 判定いれてやれば終わりかな? _________________ ちゃっぴ@わんくま同盟 ちゃっぴの監禁部屋 [ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2007-06-29 18:31 ] | ||||||||||||
|
投稿日時: 2007-06-29 19:34
みなさん、こんばんわ。
ちゃっぴさんのご指摘とおりにDIR /A で見ると<JUNCTION>といったものが確認できました。 process monitorをDLして確認したところNO MORE FILES となってました。 あるはずのものが無いとなるならやはり null を無視するのが妥当なのでしょうか。 とりあえず null を無視する方向で解決を図ろうかと思います。 皆さん、ありがとうございました。 | ||||||||||||
|
投稿日時: 2007-06-29 20:39
あー。Junctionか。それは盲点だった。 いわゆるLinux系のシンボリックリンクみたいなものです。 ちょっとはずしていますが、こちらの記事でも参考に。 http://plusd.itmedia.co.jp/pcuser/articles/0706/29/news031.html | ||||||||||||
|
投稿日時: 2007-06-29 22:27
あれ?ディレクトリかどうかを確認すればいいんじゃない?
File#isDirectory()で<JUNCTION>がDirectoryとして認識してないからnullを返している気がします。 (VIST装備してないのでしりませんが。) | ||||||||||||
|
投稿日時: 2007-07-01 21:45
Windows Vista 64bit版、Windows XP 32bit版、JDK 6 Update1の環境で
File#listFiles()がnullを返す状況の検証を試みてみました。 結果は、実行しているユーザがアクセス権を持たないディレクトリに 対してFile#listFiles()を実行した場合に、Vista/XPともにnullを 返すことが分かりました。 ここでアクセス権がないディレクトリの設定は、実行するディレクトリの セキュリティで実行するユーザのアクセス許可をすべて「拒否」とする ことで実現しています。 この検証では、NTFSのjunctionやシンボリックリンクはそれ自体が nullを返す原因ではありません。ディレクトリへのjunctionである ファイルをFileオブジェクトとして生成し、これに対してlistFiles() を呼び出した場合、junction先のディレクトリに対してアクセス権が ない場合にnullが返りました。このjunctionに対するFileオブジェクト のisDirectory()の結果はtrueです。 (Vista/XPともに。XPの場合、junction作成ツールを別途入手して作成) 一方、アクセス権のあるディレクトリの中にアクセス権のないファイルを 置いた場合に、ディレクトリのFileオブジェクトのlistFiles()呼び出し は支障なく一覧を返します。 java.io.FileクラスのlistFilesメソッドの実装を追いかけていくと、 Windows版のJava SE 6ではnativeの中でWin32 APIのFindFirstFileWおよび FindNextFileWを呼び出しています。FindFirstFileWに渡す引数で指定する ファイル名は、listFilesメソッドのターゲットオブジェクトのパス名に "\*"を付加したものとなっています。 (例:new File("C:\temp").listFiles()の場合、"C:\temp\*"を FindFirstFileWの引数に渡す) この2つのAPIがエラーを返した場合にlistFilesメソッドがnullを返します。 *但しFindNextFileWのエラーがERROR_NO_MORE_FILESの場合を除く。 | ||||||||||||
|
投稿日時: 2007-07-01 22:57
検証作業ご苦労様です。
ちょっと疑問があるんですが、JAVA では junction 普通に透過しちゃうのでしょうか? explorer.exe なんかだと、junction 自体の path を与えてやると、配下に何も存在しないものが表示されますが、そういう風にはならないんですかね? 仮に問題なく透過してしまうと、それはそれで問題ありそうですね。 今回のような処理では junction 先の一覧など必要としない場合が多いでしょうから。 # むしろ返ってきた方が問題が多い場合が多いと思われます。 また、junction 先の directory に権限が無い場合、null が返されるとのことですが、SecurityException は発生するのかも気になりますね。 # Vista に JDK いれて検証してみようかな。。。 # JAVA ちょこっとしか触っていないので、時間かかりそうですが。。。 _________________ | ||||||||||||
|
投稿日時: 2007-07-02 11:00
ToGoさん、検証&解説ありがとうございます。
nullを無視することで解決はしたのですが少し気になってnullを返すパスに対しOS上でアクセスできるか確認してみました。 結果はアクセスできませんでした。 とどのつまりは、アクセス権のようでした。 最初にちゃっぴさん、マーサさんがアクセス権を指摘されていましたのが当たりのようです。 junction 先の directory に権限が無い場合、null が返されたらSecurityException は発生するのかについては私の乏しい知識では検証できないです。すみません。。。 | ||||||||||||
|
投稿日時: 2007-07-02 18:03
透過的に扱うことができると思っているので、逆に何が問題か把握できてません。 今回は、以下に示すmklinkコマンドで/Jオプション指定でjunctionを生成しました。
dirでjunctionの中を見ると、リンク先のE:\arcのファイル一覧が表示されます。 explorerでarc.juncの中を見ると、やはりリンク先のE:\arcのファイル一覧が表示されます。 Javaからは、arc.juncを指定してFileインスタンスを生成し、そのインスタンスに対して listFiles()メソッドを呼び一覧を取得しています。
JavaのレイヤーでのSecurityExceptionは、セキュリティマネージャを設定していれば listFiles()を呼び出すFileインスタンスのパスへのJavaのセキュリティでの読み出しが許可されていないと発生します。(security.checkRead(path)で検証) したがって、listFiles()がnullを返す状況とは直接の関係はないです。 |