条件は、ディレクトリが存在する場合、新しいディレクトリを作成せずにその特定のディレクトリにファイルを作成する必要があることです。
以下のコードは、新しいディレクトリでファイルを作成するだけで、既存のディレクトリでは作成しません。たとえば、ディレクトリ名は「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()
などの呼び出しが機能すると想定しています。また、Java.io.*
クラスのいずれかを使用するときにスローされる可能性のあるIOException
で何かを行う必要があります。ファイルを書き込む関数はこの例外をスローする(および他の場所で処理する)か、メソッドで直接実行する必要があります。また、id
の型はString
であると想定しました。コードで明示的に定義されていないため、わかりません。 int
のようなものである場合は、おそらくここで行ったように、fileNameで使用する前にString
にキャストする必要があります。
また、必要に応じて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でコードを実行する場合は、おそらくこのようなベアパス名を使用しないでください。ファイル名に/
を使用するとどうなるかわかりません。完全な移植性を得るには、おそらく File.separator のようなものを使用してパスを構築する必要があります。
Edit:以下の JosefScript によるコメントによると、ディレクトリの存在をテストする必要はありません。 directory.mkdir()
呼び出しは、ディレクトリが作成されている場合はtrue
を返し、作成されていない場合はfalse
を返します(ディレクトリが既に存在する場合を含む)。
Java8 +については、以下を提案します。
/**
* Creates a File if the file does not exist, or returns a
* reference to the File if it already exists.
*/
private File createOrRetrieve(final String target) throws IOException{
final Path path = Paths.get(target);
if(Files.notExists(path)){
LOG.info("Target file \"" + target + "\" will be created.");
return Files.createFile(Files.createDirectories(path)).toFile();
}
LOG.info("Target file \"" + target + "\" will be retrieved.");
return path.toFile();
}
/**
* Deletes the target if it exists then creates a new empty file.
*/
private File createOrReplaceFileAndDirectories(final String target) throws IOException{
final Path path = Paths.get(target);
// Create only if it does not exist already
Files.walk(path)
.filter(p -> Files.exists(p))
.sorted(Comparator.reverseOrder())
.peek(p -> LOG.info("Deleted existing file or directory \"" + p + "\"."))
.forEach(p -> {
try{
Files.createFile(Files.createDirectories(p));
}
catch(IOException e){
throw new IllegalStateException(e);
}
});
LOG.info("Target file \"" + target + "\" will be created.");
return Files.createFile(
Files.createDirectories(path)
).toFile();
}
これをできるだけ短くシンプルにするようにします。ディレクトリが存在しない場合は作成し、目的のファイルを返します。
/** Creates parent directories if necessary. Then returns file */
private static File fileWithDirectoryAssurance(String directory, String filename) {
File dir = new File(directory);
if (!dir.exists()) dir.mkdirs();
return new File(directory + "/" + filename);
}
コード:
// Create Directory if not exist then Copy a file.
public static void copyFile_Directory(String Origin, String destDir, String destination) throws IOException {
Path FROM = Paths.get(Origin);
Path TO = Paths.get(destination);
File directory = new File(String.valueOf(destDir));
if (!directory.exists()) {
directory.mkdir();
}
//overwrite the destination file if it exists, and copy
// the file attributes, including the rwx permissions
CopyOption[] options = new CopyOption[]{
StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES
};
Files.copy(FROM, TO, options);
}
Java.nio.Path
を使用すると、非常に簡単になります-
public static Path createFileWithDir(String directory, String filename) {
File dir = new File(directory);
if (!dir.exists()) dir.mkdirs();
return Paths.get(directory + File.separatorChar + filename);
}