web-dev-qa-db-ja.com

File.mkdirまたはmkdirsはfalseを返します-理由は?

File.mkdirがfalseを返すのはなぜですか?

Googleは、いくつかの理由(セキュリティ、許可、パス名など)が存在する可能性があることを示しています。

私の質問:

  1. Falseを返す正確な理由を見つける方法は?
  2. セキュリティ/許可が理由である場合、なぜSecurityExceptionがスローされないのですか?
37
Sandeep Jindal

セキュリティ/許可が理由である場合、SecurityExceptionがスローされないのはなぜですか(javadocに記載されています)。

SecurityExceptionは、OSレベルではなく、JVMレベルの権限を持たない場合にスローされます

Falseを返す正確な理由を見つける方法はありますか?

いいえ、わかりません。知る唯一の方法は、自分でディレクトリのパーミッションをチェックし、それらを呼び出す前に存在しないことを確認し、親ディレクトリが存在するかどうかをチェックすることなどです。

ただし、Java 7以降を使用している場合は、代わりにNIOを使用してディレクトリを作成できます。具体的には、 Files.createDirectory

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

Java.io.Fileを使用せずにNIOを完全に使用する場合、代わりに Paths.get を使用してPathを作成できます。

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

どちらの場合も、ディレクトリを作成できない場合は、操作が失敗した正確な理由とともにIOExceptionをスローします。

これはFilesのほとんどのメソッドに当てはまるため、Fileクラスのメソッドを使用するよりも使用することをお勧めします。

25
Brian

ディレクトリが既に存在する場合、mkdirおよびmkdirsはfalseを返すため、失敗の原因の1つである可能性があります。

Java 7を使用している場合、Filesクラスを使用できます。エラー時にIOExceptionをスローします。かなり良い説明があります。

Files.createDirectory(file.toPath());
44
Michael Krussel
  1. いいえ、OSに依存する可能性があるため、少なくともJava内からではなく、mkdirs()がfalseを返す正確な理由を見つける方法はありません。

  2. SecurityExceptioncheckRead()およびcheckWrite()メソッドにセキュリティ違反がある場合、SecurityManagerがスローされます。 OSアクセス許可の問題がある場合、例外はスローされません。


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

8
Jon Lin

Windowsに固有のものを次に示します。私の場合、ネストされたディレクトリ構造を直接作成しようとしていたため、file.mkdir()メソッドはNoSuchFileExceptionで失敗しました(たとえば、最初に作成せずに_results\results_ddMMyyyy_ resultsディレクトリ)Windowsの場合。

ただし、Macではまったく同じコードが正常に機能しました。つまり、Macではそのような例外はスローされず、file.mkdir()メソッドによって中間のresultsディレクトリが暗黙的に作成されました。

これが将来誰かを助けることを願っています。

1
Akshay Maldhure