Mevcut değilse bir dizin oluşturun ve ardından bu dizindeki dosyaları da oluşturun


115

Koşul, eğer dizin mevcutsa, yeni bir dizin oluşturmadan o belirli dizinde dosyalar yaratması gerektiğidir.

Aşağıdaki kod sadece yeni dizine sahip bir dosya oluşturur, ancak mevcut dizin için değildir. Örneğin, dizin adı "GETDIRECTION" gibi olacaktır.

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

Yanıtlar:


175

Bu kod önce dizinin varlığını kontrol eder ve değilse onu oluşturur ve daha sonra dosyayı oluşturur. Lütfen tam kodunuz olmadığından bazı yöntem çağrılarınızı doğrulayamadığımı unutmayın, bu nedenle bu gibi şeylere yapılan çağrıları getTimeStamp()ve getClassName()işe yarayacağını varsayıyorum . Ayrıca IOException, java.io.*sınıflardan herhangi birini kullanırken fırlatılabilecek olasılıkla bir şeyler yapmalısınız - dosyaları yazan işleviniz bu istisnayı atmalı (ve başka bir yerde ele alınmalıdır) ya da bunu doğrudan yöntemde yapmalısınız. Ayrıca, bunun idbir tür olduğunu varsaydım String- kodunuz açıkça tanımlamadığından bilmiyorum. An gibi başka bir şeyse, benim burada yaptığım gibi fileName içinde kullanmadan önce intmuhtemelen onu bir a Stringçevirmelisiniz.

Ayrıca, appendaramalarınızı uygun gördüğüm şekilde concatveya ile değiştirdim +.

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

Kodu Microsoft Windows'ta çalıştırmak istiyorsanız muhtemelen bu gibi çıplak yol adlarını kullanmamalısınız - /dosya adlarında bunun ne işe yarayacağından emin değilim . Tam taşınabilirlik için, yollarınızı oluşturmak için muhtemelen File.separator gibi bir şey kullanmalısınız .

Düzenleme : Aşağıdaki JosefScript tarafından yapılan bir yoruma göre , dizin varlığını test etmek gerekli değildir. directory.mkdir() Çağrı dönecektir truebir dizin oluşturduk ve eğer falsedizin zaten var olan durumda da dahil olmak üzere, bu yaptığı değilse.


aramalar iyi çalışıyor. Yukarıdaki coed parçasını denediğimde, dosyayı hala PATH'a yazıyor ama dizine yazmıyor. Yeni Dosya oluşturmak için File.seperator'ı kullandım.
Sri

Lütfen tam olarak (sınıf adları ve örnek değişkenlerle) hangi çıktıyı beklediğinizi açıklayın. Örnek programımı buraya tam olarak pastebin.com/3eEg6jQv ekledim, böylece açıkladığınız şeyi yaptığını görebilirsiniz (anladığım kadarıyla).
Aaron D

1
Dosya dosyası = yeni Dosya (dizinAdı + "/" + dosyaAdı); yukarıdaki kod parçacığını StringBuffer fullFilePath = new StringBuffer (directoryName) .append (File.separator) .append (fileName) ile değiştirdim; Dosya dosyası = yeni Dosya (String.valueOf (fullFilePath)); ve işe yaradı
Sri

3
Neden dizinin varlığını kontrol etmelisiniz? Bununla oynadım ve görebildiğim kadarıyla aynı dizini iki kez oluşturursam bir fark yaratmıyor gibi görünüyor. İçerdiği dosyalar bile üzerine yazılmaz. Bir şey mi kaçırıyorum?
JosefScript

1
Bildiğim kadarıyla, Java (en azından Java 8) artık hem Windows hem de (tabii ki) Linux'ta eğik çizgilerden memnun.
Jared

82

java 8+ sürümü

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

Files.createDirectories

yeni bir dizin ve var olmayan ana dizinler oluşturur.

Dizin zaten mevcutsa, yöntem bir istisna oluşturmaz.


5
Bu en iyi cevap
somshivam

Oluşturmak için izin gerekirse ne olur?
Ajay Takur

Android için Yalnızca API 26 ve üzeri sürümlerde çalışır, bu nedenle (Build.VERSION.SDK_INT> = Build.VERSION_CODES.O) developer.android.com/reference/java/nio/file/…
Patel

24

Bunu olabildiğince kısa ve basit hale getirmeye çalışıyorum. Mevcut değilse dizin oluşturur ve ardından istenen dosyayı döndürür:

/** 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
"/" Yerine File.separatorChar kullanmayı tercih edin.
cactuschibre

23

Java8 + için aşağıdakileri öneririm.

/**
 * 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()olmalıdır Files.createDirectories(path).toFile()için Access Deniedsebeple.
Cataclysm

1
@Pytry, Files.createFile(Files.createDirectories(path))yukarıdaki yorumda anlatıldığı gibi çalışmıyor. createDirectorieszaten dosya adıyla bir dizin oluşturur, örneğin "test.txt", bu nedenle createFilebaşarısız olur.
Marcono1234

7

kod:

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

Kullanmak java.nio.Patholdukça basit olurdu -

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

Web tabanlı bir uygulama oluşturursanız, daha iyi çözüm dizinin var olup olmadığını kontrol etmektir, ardından yoksa dosyayı oluşturmaktır. Varsa yeniden oluşturun.

    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;
   }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.