- PR -

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

投稿者投稿内容
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-06-29 18:27
引用:

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



読み返してみるとその可能性が大ですね。

Vista から従来と異なる方法での junction が加わったわけですが、その扱い java ではどうなるんですかね?

引用:

nullが帰るのは対象のFileがディレクトリではない場合やエラーとなった場合ですので、



想定していなければ、そうなるような気がします。

[追記]
Junction Points in Windows Vista and Longhorn Server
[/追記]

ということは "for (File inf : infiles) {" の前で null 判定いれてやれば終わりかな?

_________________
ちゃっぴ@わんくま同盟
ちゃっぴの監禁部屋

[ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2007-06-29 18:31 ]
じゅり
会議室デビュー日: 2007/06/29
投稿数: 6
投稿日時: 2007-06-29 19:34
みなさん、こんばんわ。
ちゃっぴさんのご指摘とおりにDIR /A で見ると<JUNCTION>といったものが確認できました。
process monitorをDLして確認したところNO MORE FILES となってました。
あるはずのものが無いとなるならやはり null を無視するのが妥当なのでしょうか。

とりあえず null を無視する方向で解決を図ろうかと思います。

皆さん、ありがとうございました。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-06-29 20:39
引用:

じゅりさんの書き込み (2007-06-29 19:34) より:
ちゃっぴさんのご指摘とおりにDIR /A で見ると<JUNCTION>といったものが確認できました。


あー。Junctionか。それは盲点だった。
いわゆるLinux系のシンボリックリンクみたいなものです。

ちょっとはずしていますが、こちらの記事でも参考に。
http://plusd.itmedia.co.jp/pcuser/articles/0706/29/news031.html
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-06-29 22:27
あれ?ディレクトリかどうかを確認すればいいんじゃない?
File#isDirectory()で<JUNCTION>がDirectoryとして認識してないからnullを返している気がします。
(VIST装備してないのでしりませんが。)
ToGo
常連さん
会議室デビュー日: 2002/03/16
投稿数: 46
投稿日時: 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の場合を除く。

ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-07-01 22:57
検証作業ご苦労様です。

ちょっと疑問があるんですが、JAVA では junction 普通に透過しちゃうのでしょうか?

explorer.exe なんかだと、junction 自体の path を与えてやると、配下に何も存在しないものが表示されますが、そういう風にはならないんですかね?

仮に問題なく透過してしまうと、それはそれで問題ありそうですね。
今回のような処理では junction 先の一覧など必要としない場合が多いでしょうから。
# むしろ返ってきた方が問題が多い場合が多いと思われます。

また、junction 先の directory に権限が無い場合、null が返されるとのことですが、SecurityException は発生するのかも気になりますね。
# Vista に JDK いれて検証してみようかな。。。
# JAVA ちょこっとしか触っていないので、時間かかりそうですが。。。
_________________
じゅり
会議室デビュー日: 2007/06/29
投稿数: 6
投稿日時: 2007-07-02 11:00
ToGoさん、検証&解説ありがとうございます。
nullを無視することで解決はしたのですが少し気になってnullを返すパスに対しOS上でアクセスできるか確認してみました。
結果はアクセスできませんでした。
とどのつまりは、アクセス権のようでした。
最初にちゃっぴさん、マーサさんがアクセス権を指摘されていましたのが当たりのようです。
junction 先の directory に権限が無い場合、null が返されたらSecurityException は発生するのかについては私の乏しい知識では検証できないです。すみません。。。
ToGo
常連さん
会議室デビュー日: 2002/03/16
投稿数: 46
投稿日時: 2007-07-02 18:03
引用:

ちゃっぴさんの書き込み (2007-07-01 22:57) より:

ちょっと疑問があるんですが、JAVA では junction 普通に透過しちゃうのでしょうか?

explorer.exe なんかだと、junction 自体の path を与えてやると、配下に何も存在しないものが表示されますが、そういう風にはならないんですかね?


透過的に扱うことができると思っているので、逆に何が問題か把握できてません。
今回は、以下に示すmklinkコマンドで/Jオプション指定でjunctionを生成しました。
コード:
E:\work> mklink /J arc.junc E:\arc
E:\work> dir
   :
2007/07/01 12:34  <JUNCTION>  arc.junc
E:\work> dir arc.junc
   :
E:\work>


dirでjunctionの中を見ると、リンク先のE:\arcのファイル一覧が表示されます。
explorerでarc.juncの中を見ると、やはりリンク先のE:\arcのファイル一覧が表示されます。

Javaからは、arc.juncを指定してFileインスタンスを生成し、そのインスタンスに対して
listFiles()メソッドを呼び一覧を取得しています。

引用:

また、junction 先の directory に権限が無い場合、null が返されるとのことですが、SecurityException は発生するのかも気になりますね。


JavaのレイヤーでのSecurityExceptionは、セキュリティマネージャを設定していれば
listFiles()を呼び出すFileインスタンスのパスへのJavaのセキュリティでの読み出しが許可されていないと発生します。(security.checkRead(path)で検証)
したがって、listFiles()がnullを返す状況とは直接の関係はないです。

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