Java.nio.files - 复制文件

5
有人能告诉我以下代码哪里出了问题吗?我没有收到任何错误提示,它直接跳转到catch块中。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {

    public static void main(String[] args) {
         Path source = Paths.get("C:\\Users\\Public\\Pictures\\SamplePictures");
    Path nwdir = Paths.get("D:\\NetbeansProjects\\CopyingFiles\\copiedImages");

    try{
    Files.copy(source, nwdir);
    }catch (IOException e){
        System.out.println("Unsucessful. What a surprise!");
    }
    }
}

6
如果在catch块中打印出e.getMessage(),那么它可能会告诉你原因。 - Richante
2
如果你打印出堆栈跟踪信息,你可能会更清楚地知道发生了什么。在你的catch块中添加e.printStackTrace(System.out)。 - Matthew Farwell
你尝试过比如说 e.printStackTrace() 吗?这样你会得到更好的问题描述。 - Ernest Friedman-Hill
4
你没有收到错误提示是因为你忽略了它们。 ;) - Peter Lawrey
3个回答

7
如果你查看Files.copy的Javadocs,你会注意到这一行(强调添加):
如果该文件是目录,则在目标位置创建一个空目录(不会复制目录中的条目)。此方法可与walkFileTree方法一起使用,以复制目录和目录中的所有条目,或整个文件树(如果需要)。
所以看起来你需要使用walkFileTree方法。
(正如评论者所说,打印出异常,它们通常会告诉你问题出在哪里!)

java.nio.file.NoSuchFileException: C:\Users\Public\Pictures\SamplePictures 在 sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79) 中 at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) 中 at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102) 中 at sun.nio.fs.WindowsFileCopy.copy(WindowsFileCopy.java:99) 中 at sun.nio.fs.WindowsFileSystemProvider.copy(WindowsFileSystemProvider.java:277) 中 at java.nio.file.Files.copy(Files.java:1219) 中的 Main.main(Main.java:14) - user1311422
1
很好,但正如我所说的那样,你的代码不会起作用,因为你试图使用一个不能进行递归复制的函数来进行递归复制。看一下我提供的API链接。 - Jon7
通过递归复制,您是指示例图片中的目录、文件和目录吗?如果是这样的话 - 我已经更改了路径,直接链接到一个具有相同错误的单个 .jpg 文件。如果我误解了您的意思,请谅解。 - user1311422
没问题。你最后是怎么解决它的? - Jon7
“Sample pictures”这个目录名中间有一个空格。我以为Java会因为空格而报错,所以把它改名为“SamplePictures”。然而,这并没有更新路径。另外一个问题是我的nwdir。我以为路径会指向我想要的文件,这是正确的,但还需要文件名。 - user1311422

4

我在这里搜索了一个NIO Java7的递归复制目录到另一个位置的方法。正如Jon7在另一个答案中提到的那样,可以使用Files.walkFileTree来完成此操作。以下是我获得的一段简单目录复制代码:

final Path srcDir, final Path dstDir;
Files.walkFileTree(srcDir, new SimpleFileVisitor<Path>() {
    public FileVisitResult visitFile( Path file, BasicFileAttributes attrs ) throws IOException {
        return copy(file);
    }
    public FileVisitResult preVisitDirectory( Path dir, BasicFileAttributes attrs ) throws IOException {
        return copy(dir);
    }
    private FileVisitResult copy( Path fileOrDir ) throws IOException {
        Files.copy( fileOrDir, dstDir.resolve( srcDir.relativize( fileOrDir ) ) );
        return FileVisitResult.CONTINUE;
    }
});

如果需要更详细的示例,还可以处理文件属性和覆盖现有文件,请参阅http://docs.oracle.com/javase/tutorial/essential/io/examples/Copy.java


请注意,如果您使用srcDir.relativize(fileOrDir)在不同的文件系统之间进行复制,例如从ZipFile到默认文件系统,则会抛出ProviderMismatchException异常。 - Dilum Ranatunga

2

这是我成功地将文件从一个位置复制到另一个位置的方法:

import java.io.IOException;
import static java.nio.file.StandardCopyOption.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class App  {

 public static void main(String[] args)
 {
    Path source = Paths.get("E:/myFile.pdf");
    Path nwdir = Paths.get("F:");
    try
    { 
       Files.copy(source, nwdir.resolve(source.getFileName()), REPLACE_EXISTING);
       System.out.println("File Copied");
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
 }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接