Module java.base
Package java.nio.file

## Interface FileVisitor<T>

- All Known Implementing Classes:
    `SimpleFileVisitor`

      public interface FileVisitor<T>

  A visitor of files. An implementation of this interface is provided to the `Files.walkFileTree` methods to visit each file in a file tree.

  Usage Examples: Suppose we want to delete a file tree. In that case, each directory should be deleted after the entries in the directory are deleted.

           Path start = ...
           Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
               @Override
               public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                   throws IOException
               {
                   Files.delete(file);
                   return FileVisitResult.CONTINUE;
               }
               @Override
               public FileVisitResult postVisitDirectory(Path dir, IOException e)
                   throws IOException
               {
                   if (e == null) {
                       Files.delete(dir);
                       return FileVisitResult.CONTINUE;
                   } else {
                       // directory iteration failed
                       throw e;
                   }
               }
           });

  Furthermore, suppose we want to copy a file tree to a target location. In that case, symbolic links should be followed and the target directory should be created before the entries in the directory are copied.

           final Path source = ...
           final Path target = ...

           Files.walkFileTree(source, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
               new SimpleFileVisitor<Path>() {
                   @Override
                   public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
                       throws IOException
                   {
                       Path targetdir = target.resolve(source.relativize(dir));
                       try {
                           Files.copy(dir, targetdir);
                       } catch (FileAlreadyExistsException e) {
                            if (!Files.isDirectory(targetdir))
                                throw e;
                       }
                       return CONTINUE;
                   }
                   @Override
                   public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                       throws IOException
                   {
                       Files.copy(file, target.resolve(source.relativize(file)));
                       return CONTINUE;
                   }
               });

  Since:
    1.7

- - ### Method Summary

    Modifier and Type | Method | Description
    --- | --- | ---
    `FileVisitResult` | `postVisitDirectory​(T dir, IOException exc)` | Invoked for a directory after entries in the directory, and all of their descendants, have been visited.
    `FileVisitResult` | `preVisitDirectory​(T dir, BasicFileAttributes attrs)` | Invoked for a directory before entries in the directory are visited.
    `FileVisitResult` | `visitFile​(T file, BasicFileAttributes attrs)` | Invoked for a file in a directory.
    `FileVisitResult` | `visitFileFailed​(T file, IOException exc)` | Invoked for a file that could not be visited.

- - ### Method Detail

    - #### preVisitDirectory

          FileVisitResult preVisitDirectory​(T dir,
                                            BasicFileAttributes attrs)
                                     throws IOException

      Invoked for a directory before entries in the directory are visited.

      If this method returns `CONTINUE`, then entries in the directory are visited. If this method returns `SKIP_SUBTREE` or `SKIP_SIBLINGS` then entries in the directory (and any descendants) will not be visited.

      Parameters:
        `dir` - a reference to the directory
        `attrs` - the directory's basic attributes
      Returns:
        the visit result
      Throws:
        `IOException` - if an I/O error occurs

    - #### visitFile

          FileVisitResult visitFile​(T file,
                                    BasicFileAttributes attrs)
                             throws IOException

      Invoked for a file in a directory.
      Parameters:
        `file` - a reference to the file
        `attrs` - the file's basic attributes
      Returns:
        the visit result
      Throws:
        `IOException` - if an I/O error occurs

    - #### visitFileFailed

          FileVisitResult visitFileFailed​(T file,
                                          IOException exc)
                                   throws IOException

      Invoked for a file that could not be visited. This method is invoked if the file's attributes could not be read, the file is a directory that could not be opened, and other reasons.
      Parameters:
        `file` - a reference to the file
        `exc` - the I/O exception that prevented the file from being visited
      Returns:
        the visit result
      Throws:
        `IOException` - if an I/O error occurs

    - #### postVisitDirectory

          FileVisitResult postVisitDirectory​(T dir,
                                             IOException exc)
                                      throws IOException

      Invoked for a directory after entries in the directory, and all of their descendants, have been visited. This method is also invoked when iteration of the directory completes prematurely (by a `visitFile` method returning `SKIP_SIBLINGS`, or an I/O error when iterating over the directory).
      Parameters:
        `dir` - a reference to the directory
        `exc` - `null` if the iteration of the directory completes without an error; otherwise the I/O exception that caused the iteration of the directory to complete prematurely
      Returns:
        the visit result
      Throws:
        `IOException` - if an I/O error occurs