Eksik üst dizinlerle birlikte yeni bir dosya nasıl oluşturulur?


100

Kullanırken

file.createNewFile();

Aşağıdaki istisnayı alıyorum

java.io.IOException: Parent directory of file does not exist: /.../pkg/databases/mydb

Acaba eksik ana dizinleri oluşturan bir createNewFile var mı?

Yanıtlar:


151

Bunu denedin mi

file.getParentFile().mkdirs();
file.createNewFile();

Bunu yapacak tek bir yöntem çağrısı bilmiyorum, ancak iki ifade kadar kolay.


Bu, yalnızca dosya bir üst dizin içeren bir yol dizesiyle oluşturulmuşsa çalışır, yani new File("file.txt").getParentFile()döner null, new File("dir/file.txt").getParentFile()aynı şeyi döndürürnew File("dir")
Zoltán

1
Doğru, mkdirsoluşturmaya çalıştığınız dosya varolmayan bir dizinde değilse buna ihtiyacınız yoktur , ancak benim kullanım durumum, bazıları ana dizinlere sahipken diğerleri içermeyen birden fazla dosya oluşturmamdır .
Zoltán

14

Jon'un cevabı, bir dosyayı oluşturduğunuz yol dizesinin üst dizinleri içerdiğinden eminseniz, yani yolun formda olduğundan eminseniz işe yarar <parent-dir>/<file-name>.

Değilse, yani formun göreceli bir yoluysa <file-name>, o getParentFile()zaman geri dönecektir null.

Örneğin

File f = new File("dir/text.txt");
f.getParentFile().mkdirs();     // works fine because the path includes a parent directory.

File f = new File("text.txt");
f.getParentFile().mkdirs();     // throws NullPointerException because the parent file is unknown, i.e. `null`.

Dolayısıyla, dosya yolunuz üst dizinleri içerebilir veya içermeyebilirse, aşağıdaki kodla daha güvendesiniz:

File f = new File(filename);
if (f.getParentFile() != null) {
  f.getParentFile().mkdirs();
}
f.createNewFile();

birçok nedenden dolayı her zaman bir yol eklemelisiniz. Sistem bu dosyayı nereye koymak istediğinizi başka nasıl bilmeli?
NikkyD

@NikkyD Üzgünüm, yorumunuzu tam olarak anlamadım. Cevabımda, bir yol eklemediğinizi söylemiyorum, ancak geçilen yol üst dizinleri içermeyebilir . Cevapta böyle bir yol için bir örnek de var.
Zoltán

11

Java7 itibariyle, NIO2 API'yi de kullanabilirsiniz:

void createFile() throws IOException {
    Path fp = Paths.get("dir1/dir2/newfile.txt");
    Files.createDirectories(fp.getParent());
    Files.createFile(fp);
}
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.