2009-05-28 17 views
64

私はバグに遭遇しました。私はこのように作成され、このFileオブジェクトを、持っている:(!?)ファイルが存在すると、File.exists()はfalseを返します。

File file = new File("utilities/data/someTextFile.txt"); 

私はその後、file.exists()を行い、それがfalseを返します。ファイルが見つからない場合は、f.getAbsolutePath()をファイルに記録しています。私が道を見ると、それはOKのようです。完全なパスをWindowsの「実行」ウィンドウにコピー&ペーストすると、ファイルが正常に開きます。

ファイルは常に存在し、アプリケーションの実行中にファイルが削除されたり変更されたりすることはありません。ローカルマシンにあります。

これは特定の状況でのみ発生するようです。私はいつでもフォルトを再現することができますが、フォールトを再現するためにファイルオブジェクトのパスが変更されていないことを確信しています。

file.exists()がfalseを返す原因は何ですか?これはパーミッションやファイルロックなどと関係がありますか?

+0

exist()がfalseを返しても、ファイルから読み込むことは可能ですか? –

+0

はい、exist()がfalseを返してもファイルから読み込むことができます。 – atsjoo

+0

別のJVMを試しましたか?別のマシン?異なるオペレーティングシステム? –

答えて

15

プロセスにファイルが存在するかどうかを示すアクセス権がない場合、falseを返します。ファイルを開くことは可能かもしれませんが、通常の方法でそれが存在するかどうかはわかりません。

+18

興味深い。あなたはこれを拡大できますか?どのような特定のアクセス許可を覚えていますか? –

+0

ここにjava.nio.file.AccessDeniedExceptionがファイル/ディレクトリの存在に到達するブロック機能を持つことができます。たとえば、FARやその他のファイルエクスプローラでdirを開いたまま、dirをすべてのネストされたファイルで削除し、このディレクトリが存在することを確認すると、一時ファイルのAccessDeniedException(extends IOException)が表示されます。この場合、Files.existsはIOExceptionに対してfalseを返します。 – AlfaFire

0

Windowsの場合  Vista/Windows   7の場合は、VirtualStoreが原因である可能性があります.VirtualStoreは、Windowsが特権のないユーザーに「書き込み」をさせるメカニズムです通常はできません。ただし、変更は "%USERPROFILE%\ AppData \ Local \ VirtualStore \"に格納されています。これらは各ユーザーアカウント専用です。

+1

私はWindows XP上で動作しています – atsjoo

25

私は、Windows 7上で、次のような状況を見ています:

file.exists() == false 
file.getAbsoluteFile().exists() == true 

問題のファイルは絶対パスは、通常のサブディレクトリにある既存のファイル(しませんを参照して、ある「のvar \ログ」仮想店舗)。これはIDEから見られます。

+14

私はただ考え出しました:http://bugs.sun.com/bugdatabase/view_bug.do;:YfiG?bug_id=4483097 明らかに、ファイル上で実行されている操作は、現在のディレクトリ、getAbsolutePathはuser.dirを解決します。これらの2つのパスが一致しない場合、矛盾する結果が得られます。悪魔! –

+2

私はまったく同じ問題を抱えていますファイルが存在するかどうかを確認するために両方の方法を使用しようとしましたが、依然としてWindows 7でのみfalseになりました!何か案が? – Dejell

+0

@Odelya:どのIDEを使用していますか?あなたの-Duser.dirは何に設定されていますか?私の問題は、現在の作業ディレクトリとは異なるディレクトリに-Duser.dirを設定することによって発生しました。 –

1

[既知のファイルタイプの拡張子を隠す]チェックボックスをオンにすると、[エクスプローラ]/[実行ウィンドウ]に「t.txt」と入力すると「t.txt.txt」が開きますが、プログラムでは表示されません。

+1

私はこの問題を抱えていました。問題は、testfile.txtという名前のtxtファイルをC:\ testに作成したことです。私はC:\ test \ testFile.txtというパスを使ってこのファイルを参照しましたが、これはうまくいきませんでした。これは、ファイルが実際にtestFile.txt.txtとして保存されていたためです(上記の解決策に対する古い投票ですが、受け入れられた回答はありません)。 – Theblacknight

+0

God Windowsはとても吸います。 – aafc

11

Javaでパスを指定する方法に違いがあるようです。

は、例えば、ファイルパスがfile:/C:/DEV/test.txtとして指定されている場合、次いで

File f = new File(filename); 
f.exists(); 

falseを返します。パスはエクスプローラまたはブラウザで機能しますが、絶対パスではなくURLです。

しかし、ファイルパスがC:/DEV/test.txtとして指定されている場合、他の一方で、パスがURLではないので

File f = new File(filename); 
f.exists(); 

trueを返しますが、それは絶対パスです。

Spring Frameworkとまったく同じです。ResourceUtils.getFile(filename)は、URLまたは絶対ファイルパスのどちらでもかまいません。

+1

'file:/ C:/ DEV/test.txt'がパス名として動作することは期待していません。これはパス名ではないURLです。何人かの人がこの間違いを犯している間に、OPが持っている証拠はありません... –

8

私の場合、上記の回答は役に立たなかった。前述したように、私が持っていた:

file.exists() => false 
file.getAbsoluteFile().exists => true 

このため根本的な原因は、それがで動作するように特定のディレクトリで起動するコマンドを自動実行となるようのWindows 7マシンの所有者は、CMDのレジストリを変更していたことでしたPython。この変更により、CMDのWindows(具体的には、exists()など)を使用しているJava 1.6コードが無効になりました。レジストリから自動実行を削除すると、問題が解決しました。

+1

3.5年後、私は同じ問題に遭遇しました。 cmd.comを起動するたびに環境変数を設定するための自動実行スクリプトを設定しました。現在のディレクトリは変更されませんでした - いくつかのdoskeyマクロといくつかの環境変数。私はautorunを削除し、手動でファイル内のコマンドを実行し、突然File.exists()が正常に動作します。 –

+1

OMG、本当に(両方とも)うまくいけば、私は間違ったファイルをちょっと調べていて、なぜこのような問題が見つからなかったのかを知るためにこの質問を見つけました:) BTW、 '()'が2番目の行は 'exists'の後に); – RAM237

0

いいえ、すべての人に返信します。私はこれがWindows上のルートC:ディレクトリにアクセスするJavaに問題があると考えている。他のディレクトリは問題ありませんが、何らかの理由でC:\またはC:またはC:/と具体的に言及するとエラーが発生する可能性があります。私はこの非常に似た問題をnew File("C:");にトラップし、それを新しいFile(System.getProperty("file.separator"));に置き換えるか、ファイルディレクトリとして "c:"と言う代わりに "\"をハードコードする必要があります。エレガントではありませんが、このプロジェクトで私の仕事は終わりました。

私はそれが役に立ちそうです。適切な解決策ではないかもしれないが、少なくともそれは私のために働いた。私はJRE 1.6, Win 7です。乾杯!

謹んで、Carpenter1010

3

new Fileコマンド@

はただ与えられたパス名を使用してファイルのインスタンスを作成します。実際には、ハードドライブ上にファイルを作成しません。

あなたは

File file = new File ("path"); 
file.exists() 

を言うならこれは、同じパスを持つ既存のファイルがあった場合にのみ、trueを返すことができます。最初の行で宣言された同じファイルをチェックする場合は、この方法で使用する必要があります。

File file = new File ("path"); 
file.createNewFile(); 
file.exists(); 

これはtrueを返します。

+0

小さな説明:newキーワードを使用してコンストラクタを呼び出すたびにObjectが作成されます - この場合と同じClassが記述するObjectはFileです! File!=記述子のインスタンスではありません:) – ceph3us

0

は明らかに、考えられる原因がいくつかありますし、前の答えはそれらをよく文書化が、ここで私は1つの特定の場合にはこれを解決する方法は次のとおりです。私の学生がこの問題を持っていたし、私はほとんど私の髪を引き裂いた

それを理解しようとしている。たとえそれがそうであったとしても、ファイルは存在しないことが判明しました。問題は、Windows 7が「既知のファイルタイプのファイル拡張子を隠す」ように設定されていることでした。つまり、ファイルの名前が "data.txt"の場合、実際のファイル名は "data.txt.txt"です。

これは他の人が自分で髪を節約するのに役立ちます。

+0

私はこれが私の場合の問題ではないと思います。私の質問で述べたように:「Windowsの「実行」ウィンドウに完全なパスをコピーして貼り付けることができます。ファイルが実際に存在することを意味します。 – atsjoo

-1

私はあなたがこのように、代わりにバックスラッシュを使用すべきだと思う:

ファイルファイル=新しいファイル( "C:\\ユーザー\\ユーティリティ\\ \\データsomeTextFile.txt"); はあなたがgetAbsoluteFile(に対処したくない場合(2つのバックスラッシュではなく、タイプミス)

が問題:)

+1

私は問題が絶対パス対相対パスに関連していると思います。スラッシュはWindowsパスの場合でもJavaで有効です。 –

0

を解決する必要があります)あなたがメソッドを呼び出す必要がありますたびに呼び出されます、あなたはもっと自分のファイルを作成しますすでに絶対パスでインスタンス化されています。これは、トリックを行う必要があります。

File file = new File("utilities/data/someTextFile.txt").getAbsoluteFile(); 

私はところで、try-catchブロックとそれを囲むように示唆しています。

関連する問題