Verifique se um caminho representa um arquivo ou uma pasta

141

Eu preciso de um método válido para verificar se a Stringrepresenta um caminho para arquivo ou diretório. O que são nomes de diretório válidos no Android? À medida que saem, os nomes de pastas podem conter '.'caracteres, então como o sistema entende se há um arquivo ou uma pasta?

Egor
fonte
2
"Como o sistema entende se existe um arquivo ou uma pasta": Como o sistema não entende? Está lá no disco no sistema de arquivos e é um ou outro.
Marquês de Lorne,

Respostas:

203

Assumindo que pathé seu String.

File file = new File(path);

boolean exists =      file.exists();      // Check if the file exists
boolean isDirectory = file.isDirectory(); // Check if it's a directory
boolean isFile =      file.isFile();      // Check if it's a regular file

Veja FileJavadoc


Ou você pode usar a classe NIO Filese verificar coisas como esta:

Path file = new File(path).toPath();

boolean exists =      Files.exists(file);        // Check if the file exists
boolean isDirectory = Files.isDirectory(file);   // Check if it's a directory
boolean isFile =      Files.isRegularFile(file); // Check if it's a regular file
Baz
fonte
Como mencionei na minha pergunta, tenho apenas Strings e nenhuma instância de arquivo e não posso criá-las.
Egor
1
pathno meu exemplo é o String. Por que você não pode criar uma Fileinstância? Observe que isso não mudará nada no sistema de arquivos.
Baz
Aqui está um exemplo concreto: estou tentando criar um arquivo usando o seguinte caminho: / mnt / sdcard / arc / root e, para isDirectory (), ele retorna false. Qual é o problema aqui?
Egor
@ Egor Muito difícil dizer, já que eu não tenho um dispositivo Android. Observe que rootpode ser um arquivo. Os arquivos não têm necessariamente uma .somethingextensão.
Baz
10
O método isDirectory () retornará true somente se o arquivo existir e for um diretório. Se o arquivo fornecido no caminho não existir, também retornará false. Por isso isDirectory () deve retornar false se o caminho fornecido não existe ou existe mas não é um diretório ... Espero que ajude ..
Praful Bhatnagar
50

Solução limpa enquanto permanece na API nio:

Files.isDirectory(path)
Files.isRegularFile(path)
pgsandstrom
fonte
Essa é a melhor resposta se você estiver repetindo uma lista de diretórios. Aqui você está usando uma classe estática para executar essas verificações, em vez de criar um novo Fileobjeto a cada vez. Economiza memória
Kervvv 06/07/19
2
Não responde à pergunta. Files.isDirectory () não aceita uma String.
gerardw 6/02/19
21

Atenha-se à API nio para executar essas verificações

import java.nio.file.*;

static Boolean isDir(Path path) {
  if (path == null || !Files.exists(path)) return false;
  else return Files.isDirectory(path);
}
Sheng
fonte
2
Por que dar uma resposta no Scala quando a pergunta está solicitando código Java (consulte as tags)?
Baz
6
@Az Porque Scala é covariante para Java ... apenas brincando :-D. Eu atualizei a resposta.
Sheng
Você pode criar um diretório temporário, criar lá diretórios e arquivos. Em seguida, use o código acima e afirme. Por um lado, use arquivos / diretórios regulares, caso contrário, use algum caminho fictício do item que não é criado.
Gondri
4
String path = "Your_Path";
File f = new File(path);

if (f.isDirectory()){



  }else if(f.isFile()){



  }
Kumar Vivek Mitra
fonte
3

Não há como o sistema informar se um Stringrepresenta um fileou directory, se ele não existe no sistema de arquivos. Por exemplo:

Path path = Paths.get("/some/path/to/dir");
System.out.println(Files.isDirectory(path)); // return false
System.out.println(Files.isRegularFile(path)); // return false

E para o seguinte exemplo:

Path path = Paths.get("/some/path/to/dir/file.txt");
System.out.println(Files.isDirectory(path));  //return false
System.out.println(Files.isRegularFile(path));  // return false

Então, vemos que, em ambos os casos, o sistema retorna falso. Isso é verdade para ambos java.io.Fileejava.nio.file.Path

Emdadul Sawon
fonte
2

Para verificar se uma string representa um caminho ou um arquivo programaticamente, você deve usar métodos de API como isFile(), isDirectory().

Como o sistema entende se há um arquivo ou uma pasta?

Eu acho que as entradas de arquivo e pasta são mantidas em uma estrutura de dados e são gerenciadas pelo sistema de arquivos.

Juvanis
fonte
0
   private static boolean isValidFolderPath(String path) {
    File file = new File(path);
    if (!file.exists()) {
      return file.mkdirs();
    }
    return true;
  }
Kaweesi Joseph
fonte
0
public static boolean isDirectory(String path) {
    return path !=null && new File(path).isDirectory();
}

Para responder à pergunta diretamente.

gerardw
fonte