यदि यह मौजूद नहीं है तो एक निर्देशिका बनाएँ और फिर उस निर्देशिका में फ़ाइलें भी बनाएँ


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- मुझे नहीं पता कि आपका कोड इसे स्पष्ट रूप से परिभाषित नहीं करता है। अगर यह कुछ और की तरह है int, तो आपको इसे 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 पर कोड चलाना चाहते हैं, तो आपको इस तरह से नंगे पथ नामों का उपयोग नहीं करना चाहिए - मुझे यकीन नहीं है कि यह /फ़ाइल नाम में क्या करेगा । पूर्ण पोर्टेबिलिटी के लिए, आपको अपने रास्तों के निर्माण के लिए फ़ाइल.सेपरेटर जैसी किसी चीज़ का उपयोग करना चाहिए ।

संपादित करें : नीचे जोसेफस्क्रिप्ट की एक टिप्पणी के अनुसार , निर्देशिका अस्तित्व के लिए परीक्षण करना आवश्यक नहीं है। directory.mkdir() कॉल वापस आ जाएगी trueअगर यह एक निर्देशिका बनाया है, और falseन ही यह किया था, मामला है जब निर्देशिका पहले से ही अस्तित्व में भी शामिल है।


कॉल ठीक काम कर रहे हैं। जब मैंने कोएड के टुकड़े से ऊपर की कोशिश की, यह अभी भी फाइल को PATH को लिख रहा है, लेकिन डायरेक्टरी को नहीं। मैंने नई फ़ाइल निर्माण के लिए File.seperator का उपयोग किया है।
श्री

कृपया सटीक रूप से समझाएं (वर्गनाम और नमूना चर के साथ) आप किस आउटपुट की उम्मीद कर रहे हैं। मैंने अपना उदाहरण कार्यक्रम पूरी तरह से यहां pastebin.com/3eEg6jQv से जोड़ा है ताकि आप देख सकें कि यह वही है जो आप बता रहे हैं (जैसा कि मुझे समझ में आता है) सबसे अच्छा है।
एरोन डी

1
फ़ाइल फ़ाइल = नई फ़ाइल (निर्देशिका नाम + "/" + फ़ाइलनाम); मैंने StringBuffer fullFilePath = new StringBuffer (DirectoryName) .append (File.separator) .append (fileName) के साथ कोड स्निपेट को बदल दिया; फ़ाइल फ़ाइल = नई फ़ाइल (String.valueOf (fullFilePath)); और यह काम किया
श्री

उस स्थिति में आप mkdirs()विधि का उपयोग कर सकते हैं ।
आरोन डी

3
आपको निर्देशिका के अस्तित्व की जाँच क्यों करनी है? मैंने इसके साथ खेला और जहां तक ​​मैं देख सकता हूं इससे कोई फर्क नहीं पड़ता, अगर मैं एक ही निर्देशिका को दो बार बनाता हूं। सम्‍मिलित फ़ाइलें अधिलेखित नहीं होंगी। क्या मैं कुछ भूल रहा हूँ?
जोसेफस्क्रिप्ट

75

जावा 8+ संस्करण

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

Files.createDirectories

एक नई निर्देशिका और मूल निर्देशिका बनाता है जो मौजूद नहीं है।

यदि निर्देशिका पहले से मौजूद है, तो विधि अपवाद को नहीं फेंकती है।


5
यह सबसे अच्छा उत्तर है
सोमशिवम्

यदि अनुमति देना आवश्यक हो तो क्या होगा?
अजय ताकुर

Android के लिए यह केवल API 26 पर काम करता है और इसलिए इस लाइन की जाँच करना सुनिश्चित करें यदि (Build.VERSION.SDK_INT> = Build.VERSION_CODES.O) डेवलपर.
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
प्रलय

1
@ पाइरी, Files.createFile(Files.createDirectories(path))ऊपर टिप्पणी में वर्णित अनुसार काम नहीं करता है। createDirectoriesपहले से ही फ़ाइल नाम के साथ एक निर्देशिका बनाता है, उदाहरण के लिए "test.txt", इसलिए createFileविफल हो जाएगा।
Marcono1234

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.