There are several common uses of Files walkFileTree method.
1. Finding File
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.*;
class FileFindVisitor extends SimpleFileVisitor<Path> {
private PathMatcher matcher;
public FileFindVisitor(String pattern){
try {
matcher = FileSystems.getDefault().getPathMatcher(pattern);
} catch(IllegalArgumentException
e) {
e.printStackTrace();
}
}
public FileVisitResult visitFile(Path path, BasicFileAttributes
fileAttributes){
find(path);
return FileVisitResult.CONTINUE;
}
private void find(Path path) {
Path name = path.getFileName();
if(matcher.matches(name))
System.out.println("Match
found:" + path.getFileName());
}
public FileVisitResult preVisitDirectory(Path path,
BasicFileAttributes fileAttributes){
find(path);
return FileVisitResult.CONTINUE;
}
public static void main(String[] args) {
if(args.length != 2){
System.out.println("usage: java
FileTreeWalkFind <path>
<search pattern>");
System.exit(−1);
}
Path path = Paths.get(args[0]);
String pattern = args[1];
try {
Files.walkFileTree(path, new FileFindVisitor(pattern));
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. Deleting Directories
Before
deleting a directory all files contained in that directory must be deleted.
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.*;
class DeleteDirVisitor extends 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;
}
}
public static void main(String[] args) {
if(args.length != 1){
System.out.println("usage: java
DeleteDirVisitor <dir-to-
remove>");
System.exit(−1);
}
Path path = Paths.get(args[0]);
try {
Files.walkFileTree(path, new DeleteDirVisitor());
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. Copying Directories
Copying a
directory tree requires following symbolink links and seperate copying of all
subdirectories and files.
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.*;
class CopyDirVisitor extends SimpleFileVisitor<Path> {
Path source = null;
Path target = null;
public CopyDirVisitor(Path source,Path target){
this.source = source;
this.target = target;
}
@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;
}
public static void main(String[] args) {
if(args.length != 2){
System.out.println("usage: java
CopyDirVisitor <source-
dir-to-copy-from> <target-dir-to-copy-to>
");
System.exit(−1);
}
Path source = Paths.get(args[0]);
Path destination = Paths.get(args[1]);
try {
Files.walkFileTree(source,EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, new CopyDirVisitor(source,destination));
} catch (IOException e) {
e.printStackTrace();
}
}
}
Comments
Post a Comment