Como verificar se existe uma pasta

199

Estou brincando um pouco com os novos recursos do Java 7 IO, na verdade estou tentando receber todos os arquivos xml de uma pasta. Mas isso gera uma exceção quando a pasta não existe. Como posso verificar se a pasta existe com o novo IO?

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


}
Al Phaba
fonte
2
Gostaria de saber por que você gostaria de verificar se a pasta existe. Só porque a pasta existe quando você marcou, não significa que ela exista quando você cria o DirectoryStream, e muito menos quando você itera sobre as entradas da pasta.
Oswald
possível duplicação da nova API IO
Mr_and_Mrs_D

Respostas:

262

Usando java.nio.file.Files:

Path path = ...;

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

Opcionalmente, você pode passar esses LinkOptionvalores de método :

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

Há também um método notExists:

if (Files.notExists(path)) {
Jesper
fonte
30
Além disso, observe que ambos Files.exists(path)e Files.notExists(path)podem retornar false ao mesmo tempo! Isso significa que o Java não pôde determinar se o caminho realmente existe.
Sanchit
O_O @Sanchit você tem algum argumento forte para dizer isso?
Richard
6
A documentação diz isso. :) link Verifique se o método notExists não pode realmente vinculá-lo corretamente.
Sanchit 19/03/2014
13
Files.isDirectory (Caminho, LinkOption);
Kanagavelu Sugumar
2
@LoMaPh !Files.exists(path)e Files.notExists(path)não são 100% a mesma coisa. Quando o Java não pode determinar se existe um arquivo, o primeiro retornará truee o segundo retornará false.
Jesper
205

Bem simples:

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

E se você quer ter certeza de que é um diretório:

File f = new File("/Path/To/File/or/Directory");
if (f.exists() && f.isDirectory()) {
   ...
}
Chris Cooper
fonte
40
resposta correta, mas um pequeno aviso: if(f.isDirectory()) {...}seria suficiente, pois verifica também a existência.
G. Demecki 21/01
3
Isso não responde à pergunta do OP. java.io.filenão faz parte dos "novos recursos do Java 7 IO" aos quais o OP está se referindo. O java.nio.filepacote, que foi introduzido no Java 7, oferece as classes Pathse Files. Outras respostas aqui explicam corretamente como usar essas classes mais recentes para resolver o problema dos OPs.
Doron Gold
53

Para verificar se existe um diretório com o novo IO:

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

isDirectoryretorna truese o arquivo é um diretório; falsese o arquivo não existir, não for um diretório ou não for possível determinar se o arquivo é um diretório ou não.

Veja: documentação .

Fernando Correia
fonte
6

Você precisa transformar seu caminho em um Filee testar a existência:

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

Gere um arquivo a partir da cadeia de caracteres do seu diretório de pastas

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

e use o método existe.
Se você deseja gerar a pasta, você deve usar mkdir ()

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

Não há necessidade de chamar o exists()método separadamente , pois isDirectory()verifica implicitamente se o diretório existe ou não.

kanbagoly
fonte
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;
  }

}
Nadhu
fonte
1
File sourceLoc=new File("/a/b/c/folderName");
boolean isFolderExisted=false;
sourceLoc.exists()==true?sourceLoc.isDirectory()==true?isFolderExisted=true:isFolderExisted=false:isFolderExisted=false;
Arun Kumar Mudraboyina
fonte
sourceLoc.isDirectory () retorna resultado booleano. Não há necessidade de usar "sourceLoc.isDirectory () == true"
Oleg Ushakov
1

Podemos verificar arquivos e três pastas.

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      
        }
    }
}
Akib Bagwan
fonte
Parece que não funciona com um arquivo compartilhado da rede. Capturado: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Não é possível converter o objeto 'Z: \\ tierWe bServices \ Deploy \ new.txt' com a classe 'org.codehaus.groovy.runtime.GStringImpl' para a classe 'java.nio .fi le.Path 'org.codehaus.groovy.runtime.typehandling.GroovyCastException: Não é possível converter o objeto' Z: \\ tierWebService s \ Deploy \ new.txt 'com a classe' org.codehaus.groovy.runtime.GStringImpl 'na classe 'java.nio.file.Path'
Jirong Hu
0

No SonarLint , se você já possui o caminho, use em path.toFile().exists()vez de Files.existsobter um melhor desempenho.

O Files.existsmétodo tem um desempenho notavelmente ruim no JDK 8 e pode retardar significativamente um aplicativo quando usado para verificar arquivos que realmente não existem.

O mesmo vale para Files.notExists, Files.isDirectorye Files.isRegularFile.

Exemplo de código não conforme:

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

Solução compatível:

Path myPath;
if(myPath.toFile().exists())) {
    // do something
}
MasterHD
fonte