Bir klasörün var olup olmadığı nasıl kontrol edilir


199

Yeni Java 7 IO özellikleri ile biraz oynuyorum, aslında bir klasörün tüm xml dosyalarını almaya çalışıyorum. Ancak klasör mevcut olmadığında bu bir istisna atar, klasörün yeni ES ile var olup olmadığını nasıl kontrol edebilirim?

public UpdateHandler(String release) {
    log.info("searching for configuration files in folder " + release);
    Path releaseFolder = Paths.get(release);
    try(DirectoryStream<Path> stream = Files.newDirectoryStream(releaseFolder, "*.xml")){

        for (Path entry: stream){
            log.info("working on file " + entry.getFileName());
        }
    }
    catch (IOException e){
        log.error("error while retrieving update configuration files " + e.getMessage());
    }


}

2
Neden klasörün var olup olmadığını kontrol etmek istediğini merak ediyorum. Klasörün işaretlendiğinde var olması DirectoryStream, klasör girişlerini yinelediğinizde, klasörü oluştururken var olduğu anlamına gelmez .
Oswald

Yanıtlar:


262

Kullanma java.nio.file.Files:

Path path = ...;

if (Files.exists(path)) {
    // ...
}

İsteğe bağlı olarak bu yöntem LinkOptiondeğerlerini iletebilirsiniz :

if (Files.exists(path, LinkOption.NOFOLLOW_LINKS)) {

Ayrıca bir yöntem var notExists:

if (Files.notExists(path)) {

30
Ayrıca, hem bu notu Files.exists(path)ve Files.notExists(path)aynı zamanda yanlış dönebilirsiniz! Bu, Java'nın yolun gerçekten var olup olmadığını belirleyemediği anlamına gelir.
Sanchit

O_O @Sanchit Bunu söylemek için güçlü bir tartışmanız var mı?
Richard

6
Belgeler böyle söylüyor. :) link NotExists yönteminin gerçekten düzgün bir şekilde bağlanamadığını kontrol edin.
Sanchit

13
Files.isDirectory (Yol, LinkOption);
Kanagavelu Sugumar

2
@LoMaPh !Files.exists(path)ve Files.notExists(path)% 100 aynı şey değildir. Java bir dosyanın var olup olmadığını belirleyemediğinde, ilki geri döner trueve ikincisi geri döner false.
Jesper

205

Oldukça basit:

new File("/Path/To/File/or/Directory").exists();

Ve emin olmak istiyorsanız, bu bir dizin:

File f = new File("/Path/To/File/or/Directory");
if (f.exists() && f.isDirectory()) {
   ...
}

40
doğru cevap, ancak küçük bir uyarı: if(f.isDirectory()) {...}varlığını da kontrol ettiği için yeterli olacaktır.
G. Demecki

3
Bu OP'nin sorusuna cevap vermiyor. java.io.fileOP'nin bahsettiği "yeni Java 7 IO özellikleri" nin bir parçası değildir. java.nio.fileJava 7 tanıtıldı paketi sunuyor Pathsve Filessınıfları. Buradaki diğer yanıtlar, OP'lerin sorununu çözmek için bu yeni sınıfların nasıl kullanılacağını doğru bir şekilde açıklamaktadır.
Doron Gold

53

Yeni ES ile bir dizinin olup olmadığını kontrol etmek için:

if (Files.isDirectory(Paths.get("directory"))) {
  ...
}

isDirectorytruedosya bir dizinse geri döner ; falsedosya yoksa, bir dizin değilse veya dosyanın bir dizin olup olmadığı belirlenemez.

Bkz . Belgeler .


6

Yolunuzu a'ya dönüştürmeniz Fileve varlığını test etmeniz gerekir :

for(Path entry: stream){
  if(entry.toFile().exists()){
    log.info("working on file " + entry.getFileName());
  }
}

5

Klasör dizininizin dizesinden bir dosya oluşturun

String path="Folder directory";    
File file = new File(path);

ve kullanım yöntemi vardır.
Klasörü oluşturmak istiyorsanız mkdir () kullanmanız gerekir.

if (!file.exists()) {
            System.out.print("No Folder");
            file.mkdir();
            System.out.print("Folder created");
        }

4

Dizinin var olup olmadığını dolaylı olarak kontrol ettiği için exists()yöntemi ayrı ayrı çağırmanıza gerek yoktur isDirectory().


4
import java.io.File;
import java.nio.file.Paths;

public class Test
{

  public static void main(String[] args)
  {

    File file = new File("C:\\Temp");
    System.out.println("File Folder Exist" + isFileDirectoryExists(file));
    System.out.println("Directory Exists" + isDirectoryExists("C:\\Temp"));

  }

  public static boolean isFileDirectoryExists(File file)

  {
    if (file.exists())
    {
      return true;
    }
    return false;
  }

  public static boolean isDirectoryExists(String directoryPath)

  {
    if (!Paths.get(directoryPath).toFile().isDirectory())
    {
      return false;
    }
    return true;
  }

}

1
File sourceLoc=new File("/a/b/c/folderName");
boolean isFolderExisted=false;
sourceLoc.exists()==true?sourceLoc.isDirectory()==true?isFolderExisted=true:isFolderExisted=false:isFolderExisted=false;

sourceLoc.isDirectory (), boole sonucunu döndürür. "SourceLoc.isDirectory () == true" kullanmanıza gerek yok
Oleg Ushakov

1

Dosyaları kontrol edebilir ve klasörler oluşturabiliriz.

import java.io.*;
public class fileCheck
{
    public static void main(String arg[])
    {
        File f = new File("C:/AMD");
        if (f.exists() && f.isDirectory()) {
        System.out.println("Exists");
        //if the file is present then it will show the msg  
        }
        else{
        System.out.println("NOT Exists");
        //if the file is Not present then it will show the msg      
        }
    }
}

Görünüşe göre ağ paylaşımlı bir dosyayla çalışmaz. Yakalandı: org.codehaus.groovy.runtime.typehandling.GroovyCastException: 'j: sınıfına org.codehaus.groovy.runtime.GStringImpl' nesnesi dökülemiyor org.codehaus.groovy.runtime.GStringImpl 'sınıfı' java.nio 'ya .fi le.Path 'org.codehaus.groovy.runtime.typehandling.GroovyCastException:' Z: \\ tierWebService s \ Deploy \ new.txt 'sınıfına' org.codehaus.groovy.runtime.GStringImpl 'nesnesi atılamaz 'java.nio.file.Path'
Jirong Hu

0

Gönderen SonarLint Zaten yolunu varsa, kullanmak path.toFile().exists()yerine Files.existsdaha iyi performans için.

Files.existsYöntem JDK 8'de farkedilir düşük performans göstermesi ve aslında var olmayan dosyaları kontrol etmek kullanıldığında önemli ölçüde bir uygulama yavaşlatabilir.

Aynı şey Files.notExists, Files.isDirectoryve Files.isRegularFile.

Uyumsuz Kod Örneği:

Path myPath;
if(java.nio.Files.exists(myPath)) {  // Noncompliant
    // do something
}

Uyumlu Çözüm:

Path myPath;
if(myPath.toFile().exists())) {
    // do something
}
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.