2013-02-28 19 views
8

Jestem nowicjuszem klasy nio i mam problemy z przeniesieniem katalogu plików do nowo utworzonego katalogu.Java: Używanie nio Files.copy do przenoszenia katalogu

ja najpierw utworzyć 2 katalogi z:

File sourceDir = new File(sourceDirStr); //this directory already exists 
File destDir = new File(destDirectoryStr); //this is a new directory 

I spróbuj skopiować istniejące pliki do nowego katalogu, używając:

Path destPath = destDir.toPath(); 
for (int i = 0; i < sourceSize; i++) { 
    Path sourcePath = sourceDir.listFiles()[i].toPath(); 
    Files.copy(sourcePath, destPath.resolve(sourcePath.getFileName())); 
} 

To rzuca się następujący błąd:

Exception in thread "main" java.nio.file.FileSystemException: destDir/Experiment.log: Not a directory 

Wiem, że destDir/Experiment.log nie jest istniejącym katalogiem; powinien to być nowy plik w wyniku operacji Files.copy. Czy ktoś mógłby wskazać, gdzie moja operacja idzie źle? Dzięki!

+2

Czy 'destDir' istnieje na dysku, chociaż? Jeśli nie, możesz go najpierw utworzyć za pomocą ['Plik # mkdirs()'] (http://docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs()) . – millimoose

+0

Uruchomiłem 'destDir.exists()', który zwraca 'True'. Wygląda na to, że 'destDir/Experiment.log' powinien być katalogiem. Czy jednak tak nie jest? –

Odpowiedz

12

Trzeba użyć walkFileTree skopiować katalogi. Jeśli użyjesz Files.copy w katalogu, zostanie utworzony tylko pusty katalog.

następujący kod wzięty/adaptacja http://codingjunkie.net/java-7-copy-move/

File src = new File("c:\\temp\\srctest"); 
File dest = new File("c:\\temp\\desttest"); 
Path srcPath = src.toPath(); 
Path destPath = dest.toPath(); 

Files.walkFileTree(srcPath, new CopyDirVisitor(srcPath, destPath, StandardCopyOption.REPLACE_EXISTING)); 

public static class CopyDirVisitor extends SimpleFileVisitor<Path> 
{ 
    private final Path fromPath; 
    private final Path toPath; 
    private final CopyOption copyOption; 

    public CopyDirVisitor(Path fromPath, Path toPath, CopyOption copyOption) 
    { 
     this.fromPath = fromPath; 
     this.toPath = toPath; 
     this.copyOption = copyOption; 
    } 

    @Override 
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException 
    { 
     Path targetPath = toPath.resolve(fromPath.relativize(dir)); 
     if(!Files.exists(targetPath)) 
     { 
      Files.createDirectory(targetPath); 
     } 
     return FileVisitResult.CONTINUE; 
    } 

    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException 
    { 
     Files.copy(file, toPath.resolve(fromPath.relativize(file)), copyOption); 
     return FileVisitResult.CONTINUE; 
    } 
} 
4

Po prostu utwórz katalog docelowy, jeśli nie istnieje.

File sourceDir = new File(source); //this directory already exists 
File destDir = new File(dest); //this is a new directory 
destDir.mkdirs(); // make sure that the dest directory exists 

Path destPath = destDir.toPath(); 
for (File sourceFile : sourceDir.listFiles()) { 
    Path sourcePath = sourceFile.toPath(); 
    Files.copy(sourcePath, destPath.resolve(sourcePath.getFileName())); 
} 

Zauważ, że sourceDir.listFiles() będzie również powrót katalogów, który będzie albo chcą t recurse ich ani ignorować ...

+0

Dzięki, ale niestety nadal powoduje to ten sam błąd. Uruchomiłem nawet 'destDir.exists()', które zwraca 'True'. Wygląda na to, że 'destDir/Experiment.log' powinien być katalogiem. Czy jednak tak nie jest? –

+0

Uruchomiłem kod na stronie i działa, o ile w katalogu nie ma podkatalogów próbuję skopiować ... – RudolphEst

+0

Jedyna różnica jaką mogę wymyślić to, muszę użyć 'for (int i = 0; i

0
for (int i = 0; i < sourceSize; i++) { 
    Path sourcePath = sourceDir.listFiles()[i].toPath(); 
    Files.copy(sourcePath, destPath.resolve(sourcePath.getFileName())); 
} 

Jest to bardzo dziwny kod. Masz już gdzieś numer pliku, w sourceSize, ale wywołujesz listFiles() dla każdej iteracji. Oczekiwałem czegoś więcej tak:

for (File file : sourceDir.listFiles()) { 
    Path sourcePath = file.toPath(); 
    Files.copy(sourcePath, destPath.resolve(sourcePath.getFileName())); 
} 
+0

Z przyczyn, które nie wchodzą w zakres tego pytania, muszę użyć formatu 'int i = 0' .... Ma to związek z wyborem liczb losowych i pominięciem numeru indeksu. –

+1

Całkowicie przegapiłeś ten punkt. Nie jest to powód do ciągłego wywoływania funkcji listFiles() przy każdej iteracji. Występuje ryzyko zmiany katalogu między iteracjami i dwukrotnego przetwarzania tego samego pliku. – EJP

Powiązane problemy