Erstellen Sie ein Verzeichnis, falls es nicht vorhanden ist, und erstellen Sie dann auch die Dateien in diesem Verzeichnis


100

Voraussetzung ist, dass ein vorhandenes Verzeichnis Dateien in diesem bestimmten Verzeichnis erstellen muss, ohne ein neues Verzeichnis zu erstellen.

Der folgende Code erstellt nur eine Datei mit einem neuen Verzeichnis, jedoch nicht für ein vorhandenes Verzeichnis. Zum Beispiel würde der Verzeichnisname "GETDIRECTION" lauten.

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

Antworten:


159

Dieser Code prüft zuerst, ob das Verzeichnis vorhanden ist, erstellt es, falls nicht, und erstellt anschließend die Datei. Bitte beachten Sie, dass ich einige Ihrer Methodenaufrufe nicht überprüfen konnte, da ich nicht über Ihren vollständigen Code verfüge. Daher gehe ich davon aus, dass die Aufrufe von Dingen wie getTimeStamp()und getClassName()funktionieren werden. Sie sollten auch etwas mit dem Möglichen tun, das IOExceptionbei Verwendung einer der java.io.*Klassen ausgelöst werden kann - entweder sollte Ihre Funktion, die die Dateien schreibt, diese Ausnahme auslösen (und sie wird an anderer Stelle behandelt), oder Sie sollten dies direkt in der Methode tun. Außerdem habe ich angenommen, dass dies idvom Typ ist String- ich weiß es nicht, da Ihr Code es nicht explizit definiert. Wenn es etwas anderes wie ein ist int, sollten Sie es wahrscheinlich in ein Stringumwandeln, bevor Sie es im Dateinamen verwenden, wie ich es hier getan habe.

Außerdem habe ich Ihre appendAnrufe durch concatoder +nach meinem Ermessen ersetzt.

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

Sie sollten wahrscheinlich keine bloßen Pfadnamen wie diesen verwenden, wenn Sie den Code unter Microsoft Windows ausführen möchten - ich bin nicht sicher, was er mit /den Dateinamen tun wird . Für eine vollständige Portabilität sollten Sie wahrscheinlich File.separator verwenden , um Ihre Pfade zu erstellen .

Bearbeiten : Laut einem Kommentar von JosefScript unten ist es nicht notwendig, die Existenz eines Verzeichnisses zu testen. Der directory.mkdir() Aufruf wird zurückgegeben, truewenn ein Verzeichnis erstellt wurde, und falsewenn dies nicht der Fall ist, einschließlich des Falls, in dem das Verzeichnis bereits vorhanden war.


Die Anrufe funktionieren einwandfrei. Wenn ich oben versucht habe, schreibt es immer noch die Datei in PATH, aber nicht in das Verzeichnis. Ich habe den File.seperator für die neue Dateierstellung verwendet.
Sri

Bitte erläutern Sie genau (mit Klassennamen und Beispielvariablen), welche Ausgabe Sie erwarten. Ich habe mein Beispielprogramm hier vollständig angefügt. Pastebin.com/3eEg6jQv, damit Sie sehen können, dass es das tut, was Sie beschreiben (so gut ich es verstehe).
Aaron D

1
Datei Datei = neue Datei (Verzeichnisname + "/" + Dateiname); Ich habe das obige Code-Snippet durch StringBuffer fullFilePath = new StringBuffer (Verzeichnisname) .append (File.separator) .append (Dateiname) ersetzt. Datei file = neue Datei (String.valueOf (fullFilePath)); und es funktionierte
Sri

In diesem Fall können Sie die mkdirs()Methode verwenden.
Aaron D

3
Warum müssen Sie nach der Existenz des Verzeichnisses suchen? Ich habe damit herumgespielt und soweit ich sehen kann, scheint es keinen Unterschied zu machen, wenn ich dasselbe Verzeichnis zweimal erstelle. Selbst enthaltene Dateien werden nicht überschrieben. Vermisse ich etwas
JosefScript

51

Java 8+ Version

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

Die Files.createDirectories

Erstellt ein neues Verzeichnis und übergeordnete Verzeichnisse, die nicht vorhanden sind.

Die Methode löst keine Ausnahme aus, wenn das Verzeichnis bereits vorhanden ist.


2
Dies ist die beste Antwort
Somshivam

Was passiert, wenn zum Erstellen eine Berechtigung erforderlich ist?
Ajay Takur

23

Der Versuch, dies so kurz und einfach wie möglich zu gestalten. Erstellt ein Verzeichnis, falls es nicht vorhanden ist, und gibt dann die gewünschte Datei zurück:

/** 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
Verwenden Sie lieber File.separatorChar anstelle von "/".
Cactuschibre

21

Ich würde Folgendes für Java8 + vorschlagen.

/**
 * 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()sollte Files.createDirectories(path).toFile()für Access DeniedGrund.
Katastrophe

1
@Pytry, Files.createFile(Files.createDirectories(path))funktioniert nicht wie im obigen Kommentar beschrieben. createDirectorieserstellt bereits ein Verzeichnis mit dem Dateinamen, zB "test.txt", schlägt daher createFilefehl.
Marcono1234

6

Code:

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


}

4

Die Verwendung java.nio.Pathwäre ganz einfach -

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

Wenn Sie eine webbasierte Anwendung erstellen, besteht die bessere Lösung darin, zu überprüfen, ob das Verzeichnis vorhanden ist oder nicht, und die Datei zu erstellen, wenn sie nicht vorhanden ist. Wenn vorhanden, neu erstellen.

    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;
   }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.