2012-08-30 32 views
27

なぜfile.mkdirはfalseを返すのですか?File.mkdirまたはmkdirsはfalseを返す - 理由?

Googleはいくつかの理由(例えば、セキュリティ、権限、パス名など)があるかもしれないことを示しています。

私の質問:

  1. falseを返すの正確な理由を見つけるためにどのように?
  2. セキュリティ/アクセス権が理由であれば、なぜSecurityExceptionがスローされませんか?

答えて

16

セキュリティ/アクセス権の場合は、(のjavadocに記載されている)理由、なぜに、SecurityExceptionがスローされないのですか?

SecurityExceptionは、あなたが何かではなく、OSレベル

なぜfalseを返すの正確な理由を見つける方法はありますを行うにはJVMレベルの権限を持っていない場合にスローされますか?

いいえ、私の知る限り。あなたが知っている唯一の方法は、ディレクトリのアクセス権を自分で確認し、呼び出す前に存在しないことを確認し、親ディレクトリが存在するかどうかを確認することです。

Java 7以上の場合は、代わりにNIOを使用してディレクトリを作成できます。ディレクトリができない場合、いずれの場合も

Path dir = Paths.get("mydir"); 
Files.createDirectory(dir); 

:具体的には、Files.createDirectory:あなたは完全にjava.io.Fileを使用してNIOを使用したい場合は

File dir = new File("mydir"); 
Files.createDirectory(dir.toPath()); 

、あなたはPath代わりを作成するためにPaths.getを使用することができます操作が失敗した理由と同じ理由でIOExceptionがスローされます。

これはFilesのほとんどのメソッドに当てはまります。したがって、Fileクラスのメソッドを使用するよりも使用することをお勧めします。それはおそらくOS依存なよう

+1

"mkdir"では、mkdir( "/ path1/path2 /")にしようとしています。コマンドを実行する前にpath1(親)フォルダが存在しない場合、mkdirは失敗し、既存のフォルダ内に新しいフォルダを作成できます。mkdirsはpath1とpath2のすべてのフォルダを作成できます。私はmkdirの失敗には手がかりがありません。助けてほしいと思っています。 – Andiana

+0

@Andiana Correct。これは、Javaの 'File.mkdir'がWindowsの規則ではなくLinuxの規則に従い、中間のディレクトリを作成しないためです。 'File.mkdirs'はWindowsの規則に従い、Linuxでは' mkdir --parents'のように動作します。いい視点ね。それでも、正確な理由を得るために、以下のマイケルの答えが最善のものです:JavaのNIOパッケージを使用してください。 – Brian

8
  1. はありません、少なくともではないJavaの中から、mkdirs()はfalseを返します正確な理由を見つける方法はありません。 SecurityManagercheckRead()checkWrite()方法でセキュリティ違反があった場合に

  2. SecurityExceptionがスローされます。 OSのアクセス権の問題がある場合、例外はスローされません。


また、あなたがFile.mkdir()を呼び出して、親ディレクトリが存在しない場合、mkdir()はfalseを返すことに注意してください。ただし、File.mkdirs()を呼び出すと、存在しない親ディレクトリが作成されます。

38

mkdirとmkdirsは、ディレクトリがすでに存在する場合はfalseを返します。そのため、障害の原因の1つになる可能性があります。

Java 7を使用している場合は、Filesクラスを使用できます。それはかなり良い記述でエラーでIOExceptionをスローします。

Files.createDirectory(file.toPath()); 
+6

ディレクトリが既に存在する場合、またはディレクトリの作成中にエラーが発生した場合は、falseを返します。今、役に立つAPIがあります。 –

関連する問題