2010-07-26 10 views
5

Estoy trabajando en este programa para obtener todos los archivos en el directorio. Por alguna razón, estoy obteniendo una NullPointerException en la línea 16. No sé por qué, ya que esta es una plantilla que parecía funcionar en clase con nuestro profesor. Gracias.Programa para obtener todos los archivos dentro de un directorio en Java

import java.util.*; 
import java.io.*; 

public class FindDirectories { 
    public static void main(String[] args) { 
     if (args.length == 0) { 
      args = new String[] { ".." }; 
     } 

     List<String> nextDir = new ArrayList<String>(); 
     nextDir.add(args[0]); // either the one file, or the directory 
     try { 
      while(nextDir.size() > 0) {  // size() is num of elements in List 
       File pathName = new File(nextDir.get(0)); // gets the element at the index of the List 
       String[] fileNames = pathName.list(); // lists all files in the directory 
       for(int i = 0; i < fileNames.length; i++) { 
        File f = new File(pathName.getPath(), fileNames[i]); // getPath converts abstract path to path in String, 
                    // constructor creates new File object with fileName name 
        if (f.isDirectory()) { 
        System.out.println(f.getCanonicalPath()); 
        nextDir.add(f.getPath()); 
        } 
        else { 
         System.out.println(f); 
        } 
       } 
       nextDir.remove(0); 
      } 
     } 
     catch(IOException e) { 
      e.printStackTrace(); 
     }  
    } 
} 

Respuesta

9

Compruebe el Javadoc for File.list(). Específicamente:

Devuelve nulo si este nombre de ruta abstracto no indica un directorio, o si se produce un error de E/S.

En su código pathName.list(); debe ser por lo devuelva NULL pathName no representa un directorio válido, o un error IO ocurrió al intentar obtener una lista de los archivos de ese directorio.

+0

¿Cómo verifico que? ¿Acabo de decir pathName.list()! = null? – Crystal

+0

Sí @Crystal, deberías probar eso. Luego, decida qué hacer cuando esto suceda: informe un error, solicite al usuario el código correcto, etc. – krock

0

Si usted está recibiendo una NullPointerException en la línea 16, que debe significar que fileNames es nula, por lo fileNames.length no es válido. Eche un vistazo al the javadoc for File.list y verá que pathName.list() puede ser nulo si pathName no es un directorio, o si se produce una excepción. Por lo tanto, solo deberá verificar si fileNames es nulo antes de intentar usarlo.

0
import java.io.File; 
import java.util.ArrayList; 
import java.util.LinkedList; 


public class FileEnumerator { 

    /** 
    * @param args 
    * @throws IOException 
    */ 
    public static void main(String[] args) throws IOException { 

     // Prepare the List of files 
     String path = "C:/"; 
     ArrayList<String> Files = new ArrayList<String>(); 
     LinkedList<String> Dir = new LinkedList<String>(); 
     File f = new File(path); 
     Dir.add(f.getAbsolutePath()); 
     while(!Dir.isEmpty()) 
     { 
      f = new File(Dir.pop()); 
      if(f.isFile()) 
      { 
       Files.add(f.getAbsolutePath()); 
      } 
      else 
      { 
       String arr[] = f.list(); 
       try 
       { 
       for(int i = 0;i<arr.length;i++) 
       { 
        Dir.add(f.getAbsolutePath()+"/"+arr[i]); 
       } 
       } 
       catch(NullPointerException exp) 
       { 
        Dir.remove(f.getAbsoluteFile()); 
       } 
      } 
     } 


       //Print the files 
     for(int i = 0;i<Files.size();i++) 
     { 
      System.out.println(Files.get(i)); 
     } 
    } 

} 

Creo que este código debería funcionar bien. Aunque lo he probado solo en Windows. Pero otros sistemas operativos necesitarán como mucho pequeños cambios.

+0

"Creo que este código debería funcionar bien. Aunque lo probé solo en Windows. Pero otros sistemas operativos necesitarán como mucho pequeños cambios". Dado que un buen código Java debe ejecutarse en otro sistema operativo con ** cambios **, el código en su respuesta es * no * un buen ejemplo. Por lo menos, debería usar 'System.getProperty (" file.separator ")' o el constructor 'File' que acepta argumentos de ruta/nombre en lugar de'/'. Entonces podríamos usar objetos 'String' para representar' File's. Presumiendo una unidad 'C:' en lugar de aceptar una línea de comando arg. (...) –

4

Uso fragmento de abajo para obtener todos los archivos de todos los subdirectorios:

import java.io.File; 

/** 
* 
* @author santoshk 
*/ 
public class ListFiles { 

    File mainFolder = new File("F:\\personal"); 
    public static void main(String[] args) 
    { 
     ListFiles lf = new ListFiles(); 
     lf.getFiles(lf.mainFolder); 
    } 
    public void getFiles(File f){ 
     File files[]; 
     if(f.isFile()) 
      System.out.println(f.getAbsolutePath()); 
     else{ 
      files = f.listFiles(); 
      for (int i = 0; i < files.length; i++) { 
       getFiles(files[i]); 
      } 
     } 
    } 
} 
0
import java.io.*; 

public class filedir 
{ 
    public static void main(String[] args) 
    { 
     try{ 
      Files f = new File("C:\\");//the path required 
      String a[]; 
      a=f.list(); 
      for (int i = 0; i <a.length; i++) { 
       System.out.println(a[i]); 
       } 
     } catch(Exception e) { 
      System.err.println(e); 
     } 
    } 
} 
+1

Espero que entiendas la idea con este pequeño código ... lo siento si no fue la respuesta a la pregunta. – anjuna

Cuestiones relacionadas