2015-03-09 1 views
23

Условие - если существует каталог, он должен создавать файлы в этом конкретном каталоге, не создавая новый каталог.Создайте каталог, если он не существует, а затем создайте файлы в этом каталоге.

Приведенный ниже код создает только файл с новым каталогом, но не для существующего каталога. Например, имя каталога будет как «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(); 
+1

Вы только назвать 'file.createNewFile()' внутри вашего условной 'если это (! Directory.exists()) {}' - Дон Вам нужно это сделать, даже если каталог существует? –

+0

Да, мне нужно создать файл даже, даже если каталог существует – Sri

+0

Итак, что, если вы положите после 'if (! Directory.exists()) {}' a 'else', который также создает файл? 'else {file.createNewFile(); } '- это имеет значение? –

ответ

36

Этот код проверяет существование каталога первого и создает его, если нет, то и создает файл впоследствии. Обратите внимание, что я не мог проверить некоторые вызовы методов, так как у меня нет полного кода, поэтому я принимаю вызовы на такие вещи, как getTimeStamp() и getClassName(). Вы также должны сделать что-то с возможным IOException, которое может быть выброшено при использовании любого из классов java.io.* - либо ваша функция, которая пишет файлы, должна выбросить это исключение (и оно будет обрабатываться в другом месте), либо вы должны сделать это непосредственно в этом методе. Кроме того, я предположил, что id имеет тип String - я не знаю, поскольку ваш код явно не определяет его. Если это что-то вроде int, вы должны, вероятно, применить его к String, прежде чем использовать его в fileName, как я здесь сделал.

Кроме того, я заменил ваши звонки appendconcat или +, как я понял.

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, если это не так, включая случай, когда каталог уже существует.

+0

звонки работают нормально. КОГДА я пробовал над куском coed, он все еще записывает файл в PATH, но не в каталог. Я использовал File.seperator для создания нового файла. – Sri

+0

Пожалуйста, объясните точно (с именами классов и примерными переменными), какой результат вы ожидаете. Я приложил свою примерную программу полностью здесь http://pastebin.com/3eEg6jQv, чтобы вы могли видеть, что она делает то, что вы описываете (насколько я понимаю). –

+1

Файл файла = новый Файл (directoryName + "/" + имя_файла); Я заменил фрагмент кода выше на StringBuffer fullFilePath = new StringBuffer (directoryName) .append (File.separator) .append (fileName); Файл файла = новый файл (String.valueOf (fullFilePath)); и он работал – Sri

0

код:

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


} 
3

Я хотел бы предложить следующее за Java8 +.

/** 
* Deletes the target if it exists then creates a new empty file. 
*/ 
private File createOrReplaceFileAndDirectories(String target) throws IOException{ 

    Path path = Paths.get(target); 
    if(Files.deleteIfExists(path)){ 
     LOG.info("Deleted existing file \""+target+"\"."); 
    } 
    LOG.info("Target file \""+target+"\" will be created."); 

    return Files 
     .createFile(
      Files.createDirectories(path)) 
     .toFile(); 
}} 
0

Попытка сделать это как можно коротким и простым. Создает каталог, если он не существует, а затем возвращает нужный файл:

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