Створіть каталог, якщо він не існує, а потім також створіть файли в цьому каталозі


112

Умова полягає в тому, що якщо каталог існує, він повинен створювати файли в цьому конкретному каталозі без створення нового каталогу.

Наведений нижче код лише створює файл із новим каталогом, але не для існуючого каталогу. Наприклад, назва каталогу буде виглядати як "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();

Відповіді:


172

Цей код спочатку перевіряє наявність каталогу і створює його, якщо ні, а потім створює файл. Зверніть увагу, що я не зміг перевірити деякі ваші виклики методів, оскільки у мене немає вашого повного коду, тому я припускаю, що виклики таких речей, як getTimeStamp()і getClassName()будуть працювати. Ви також повинні зробити щось із можливого, IOExceptionщо може бути викинуте під час використання будь-якого з java.io.*класів - або ваша функція, яка пише файли, повинна викинути це виняток (і це буде оброблятися в іншому місці), або ви повинні зробити це безпосередньо в методі. Крім того, я припустив, що idце тип String- я не знаю, оскільки ваш код не чітко його визначає. Якщо це щось інше на зразок an int, ви, мабуть, повинні передати його aString перш ніж використовувати його у 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 - я не впевнений, що це буде робити з /іменами файлів. Для повної переносимості вам, мабуть, слід використовувати щось на зразок File.separator для побудови своїх шляхів.

Редагувати : Відповідно до коментаря JosefScript нижче, не потрібно перевіряти наявність каталогів. directory.mkdir() Виклик буде повертати , trueякщо він був створений каталог, і falseякщо він не зробив, в тому числі в разі , коли каталог вже існує.


дзвінки працюють нормально. Коли я спробував вище шматок коду, він все ще пише файл у PATH, але не в каталог. Я використовував File.seperator для створення нового файлу.
Шрі

Будь ласка, точно поясніть (з іменами класів та зразками змінних), який результат ви очікуєте. Я приклав свою прикладну програму повністю тут pastebin.com/3eEg6jQv, щоб ви могли бачити, що вона виконує те, що ви описуєте (наскільки я розумію).
Аарон Д,

1
Файл файлу = новий файл (Ім'я каталогу + "/" + Ім'я файлу); я замінив наведений вище фрагмент коду на StringBuffer fullFilePath = новий StringBuffer (ім'я каталогу) .append (File.separator) .append (ім'я файлу); Файл файлу = новий файл (String.valueOf (fullFilePath)); і це спрацювало
Шрі

У цьому випадку ви можете використовувати mkdirs()метод.
Аарон Д,

3
Чому вам потрібно перевірити наявність каталогу? Я погрався з цим, і, наскільки я бачу, це, здається, не має значення, якщо я створив один і той же каталог двічі. Навіть файли, що містяться, не будуть перезаписані. Мені чогось не вистачає?
JosefScript

75

версія Java 8+

Files.createDirectories(Paths.get("/Your/Path/Here"));

Файли.createDirectories

створює новий каталог та батьківські каталоги, які не існують.

Метод не створює винятку, якщо каталог уже існує.


5
Це найкраща відповідь
сомшивам

Що станеться, якщо для створення потрібен дозвіл?
Аджай Такур

Для Android Він працює лише на API 26 і новіших версій, тому обов’язково перевірте цей рядок, якщо (Build.VERSION.SDK_INT> = Build.VERSION_CODES.O) developer.android.com/reference/java/nio/file/…
Arpit Patel

24

Намагаючись зробити це якомога коротшим і простішим. Створює каталог, якщо він не існує, а потім повертає потрібний файл:

/** 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);
}

9
Віддайте перевагу використанню File.separatorChar замість "/".
cactuschibre

23

Я б запропонував наступне для 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();
}

1
Files.createFile(Files.createDirectories(path)).toFile()повинно бути Files.createDirectories(path).toFile()з Access Deniedпричини.
Cataclysm

1
@Pytry, Files.createFile(Files.createDirectories(path))не працює, як описано у коментарі вище. createDirectoriesвже створює каталог з іменем файлу, наприклад "test.txt", тому createFileне вдасться.
Марконо1234,

7

код:

// 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);


}

5

Використовувати 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);
    }

0

Якщо ви створюєте веб-програму, найкращим рішенням буде перевірити, чи існує каталог чи ні, а потім створити файл, якщо він не існує. Якщо існує, відтворіть знову.

    private File createFile(String path, String fileName) throws IOException {
       ClassLoader classLoader = getClass().getClassLoader();
       File file = new File(classLoader.getResource(".").getFile() + path + fileName);

       // Lets create the directory
       try {
          file.getParentFile().mkdir();
       } catch (Exception err){
           System.out.println("ERROR (Directory Create)" + err.getMessage());
       }

       // Lets create the file if we have credential
       try {
           file.createNewFile();
       } catch (Exception err){
           System.out.println("ERROR (File Create)" + err.getMessage());
       }
       return  file;
   }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.