代码之家  ›  专栏  ›  技术社区  ›  SNpn

递归读取文件夹中的所有文件Java

  •  3
  • SNpn  · 技术社区  · 12 年前

    我需要编写一个程序来读取文件夹路径 stdin 以及它的所有子文件夹,然后根据扩展名打印出文件的数量。

    它将被编译如下:

    java Summary -r <path>

    输出需要看起来像:

    txt:
      number of files: 5
      combined size: 1202131
      largest file: 729224
      smallest file: 12323
    pdf:
      number of files: 2
      etc...
    

    有人能帮我做这个吗?我不知道该怎么办。

    4 回复  |  直到 12 年前
        1
  •  6
  •   Community CDub    7 年前

    你可以从这样的东西开始递归地读取文件

    public void listFilesForFolder(final File folder) {
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                listFilesForFolder(fileEntry);
            } else {
                System.out.println(fileEntry.getName());
            }
        }
    }
    

    此代码由@rich编写。

    其余的细节是你必须解决的。

    你可以看到 Read all files in a folder 了解更多详细信息

        2
  •  0
  •   Community CDub    7 年前

    看看这个: List files from directories and sub directories in java including only partial file paths

    您将获得目录下所有文件的列表,然后您可以使用 file.length() 以获取尺寸。

        3
  •  0
  •   zacheusz    12 年前

    与此代码相似的东西(来自 http://www.javapractices.com/topic/TopicAction.do?Id=68 )以下为:

    在JDK 7中:

    import java.io.IOException;
    import java.nio.file.FileVisitResult;
    import java.nio.file.FileVisitor;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.nio.file.SimpleFileVisitor;
    import java.nio.file.attribute.BasicFileAttributes;
    
    /** Recursive listing with SimpleFileVisitor in JDK 7. */
    public final class FileListingVisitor {
    
      public static void main(String... aArgs) throws IOException{
        String ROOT = "C:\\test";
        FileVisitor<Path> fileProcessor = new ProcessFile();
        Files.walkFileTree(Paths.get(ROOT), fileProcessor);
      }
    
      private static final class ProcessFile extends SimpleFileVisitor<Path> {
        @Override public FileVisitResult visitFile(
          Path aFile, BasicFileAttributes aAttrs
        ) throws IOException {
          System.out.println("Processing file:" + aFile);
          return FileVisitResult.CONTINUE;
        }
    
        @Override  public FileVisitResult preVisitDirectory(
          Path aDir, BasicFileAttributes aAttrs
        ) throws IOException {
          System.out.println("Processing directory:" + aDir);
          return FileVisitResult.CONTINUE;
        }
      }
    } 
    

    在旧版本中:

    import java.util.*;
    import java.io.*;
    
    /**
    * Recursive file listing under a specified directory.
    *  
    * @author javapractices.com
    * @author Alex Wong
    * @author anonymous user
    */
    public final class FileListing {
    
      /**
      * Demonstrate use.
      * 
      * @param aArgs - <tt>aArgs[0]</tt> is the full name of an existing 
      * directory that can be read.
      */
      public static void main(String... aArgs) throws FileNotFoundException {
        File startingDirectory= new File(aArgs[0]);
        List<File> files = FileListing.getFileListing(startingDirectory);
    
        //print out all file names, in the the order of File.compareTo()
        for(File file : files ){
          System.out.println(file);
        }
      }
    
      /**
      * Recursively walk a directory tree and return a List of all
      * Files found; the List is sorted using File.compareTo().
      *
      * @param aStartingDir is a valid directory, which can be read.
      */
      static public List<File> getFileListing(
        File aStartingDir
      ) throws FileNotFoundException {
        validateDirectory(aStartingDir);
        List<File> result = getFileListingNoSort(aStartingDir);
        Collections.sort(result);
        return result;
      }
    
      // PRIVATE //
      static private List<File> getFileListingNoSort(
        File aStartingDir
      ) throws FileNotFoundException {
        List<File> result = new ArrayList<File>();
        File[] filesAndDirs = aStartingDir.listFiles();
        List<File> filesDirs = Arrays.asList(filesAndDirs);
        for(File file : filesDirs) {
          result.add(file); //always add, even if directory
          if ( ! file.isFile() ) {
            //must be a directory
            //recursive call!
            List<File> deeperList = getFileListingNoSort(file);
            result.addAll(deeperList);
          }
        }
        return result;
      }
    
      /**
      * Directory is valid if it exists, does not represent a file, and can be read.
      */
      static private void validateDirectory (
        File aDirectory
      ) throws FileNotFoundException {
        if (aDirectory == null) {
          throw new IllegalArgumentException("Directory should not be null.");
        }
        if (!aDirectory.exists()) {
          throw new FileNotFoundException("Directory does not exist: " + aDirectory);
        }
        if (!aDirectory.isDirectory()) {
          throw new IllegalArgumentException("Is not a directory: " + aDirectory);
        }
        if (!aDirectory.canRead()) {
          throw new IllegalArgumentException("Directory cannot be read: " + aDirectory);
        }
      }
    } 
    
        4
  •  0
  •   R.D. Prasad De Silva    10 年前

    请使用以下代码。

    public static void listFiles(final File folder) {
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isFile() && fileEntry.getName().endsWith(".txt")) {
                System.out.println(fileEntry.getName());
            }
        if (fileEntry.isFile() && fileEntry.getName().endsWith(".pdf")) {
                System.out.println(fileEntry.getName());
            }
         else {
                listFiles(fileEntry);
            }
        }
    }
    
    public static void main(String startingPath){
        File folder = new File(startingPath);
        listFiles(folder);
    }