1. ホーム
  2. java

[解決済み] ディレクトリが存在しない場合は作成し、そのディレクトリにファイルも作成します。

2022-03-03 03:56:26

質問

条件は、ディレクトリが存在する場合、新しいディレクトリを作成することなく、その特定のディレクトリにファイルを作成する必要があります。

以下のコードでは、新しいディレクトリにファイルを作成するだけで、既存のディレクトリには作成されません。例えば、ディレクトリ名は "GETDIRECTION"のようなものです。

String PATH = "/remote/dir/server/";
    
String fileName = PATH.append(id).concat(getTimeStamp()).append(".txt");  
             
String directoryName = PATH.append(this.getClassName());   
              
File file  = new File(String.valueOf(fileName));

File directory = new File(String.valueOf(directoryName));

if (!directory.exists()) {
        directory.mkdir();
        if (!file.exists() && !checkEnoughDiskSpace()) {
            file.getParentFile().mkdir();
            file.createNewFile();
        }
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(value);
bw.close();


解決方法は?

このコードでは、まずディレクトリの存在を確認し、なければ作成し、その後にファイルを作成します。私はあなたの完全なコードを持っていないので、あなたのメソッドコールのいくつかを確認できなかったことに注意してください。 getTimeStamp()getClassName() が動作します。また、可能な限り IOException のいずれかを使用したときにスローされる可能性があります。 java.io.* ファイルを書き込む関数がこの例外を投げる (そしてそれは別の場所で処理される) ようにするか、メソッド内で直接処理する必要があります。また、私が想定していたのは id は、型 String - あなたのコードでは明示的に定義されていないのでわかりません。もし、それが int にキャストする必要があります。 String のように、fileNameで使用する前に、このようにします。

また append の呼び出しを concat または + を、適当に見繕った。

public void writeFile(String value){
    String PATH = "/remote/dir/server/";
    String directoryName = PATH.concat(this.getClassName());
    String fileName = id + getTimeStamp() + ".txt";

    File directory = new File(directoryName);
    if (! directory.exists()){
        directory.mkdir();
        // If you require it to make the entire directory path including parents,
        // use directory.mkdirs(); here instead.
    }

    File file = new File(directoryName + "/" + fileName);
    try{
        FileWriter fw = new FileWriter(file.getAbsoluteFile());
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write(value);
        bw.close();
    }
    catch (IOException e){
        e.printStackTrace();
        System.exit(-1);
    }
}

Microsoft Windows上でコードを実行したい場合は、このようなベアパス名は使わない方が良いでしょう。 / をファイル名として使用します。完全な移植性を得るには、おそらく次のようなものを使うべきでしょう。 ファイル.セパレータ を使用してパスを構築します。

編集 : のコメントによると ヨーゼフスクリプト の下にあるように、ディレクトリの存在をテストする必要はないのです。その directory.mkdir() の呼び出しは true はディレクトリを作成した場合、そして false は、ディレクトリがすでに存在する場合も含めて、そうでない場合は