我有一个包含一些文件的目录和包含更多文件的子目录。
Folder - Directory (path -> /home/abc/xyz/Folder)
->Abc.txt (file)
-> Xyz.zip (file)
-> Address (Sub Directory)
-> PWZ.log (file)
-> CyZ.xml (file)
-> DataLog.7zip
等
我要做的是将这个完整的目录从一个路径移动到另一个路径,包括所有文件和子文件夹(及其文件)。
即移动此"文件夹"从/ home / abc / xyz /文件夹到/ home / abc / subdir / Folder。
Java是否提供了基于FOLDER目录执行此任务的任何API,还是我们需要将每个文件递归复制到此路径?
答案 0 :(得分:10)
您只需使用
移动目录即可import static java.nio.file.StandardCopyOption.*;
Files.move(new File("C:\\projects\\test").toPath(), new File("C:\\projects\\dirTest").toPath(), StandardCopyOption.REPLACE_EXISTING);
更改来源和目的地路径
请参阅here以获取更多详情
另请参阅API
When invoked to move a
* directory that is not empty then the directory is moved if it does not
* require moving the entries in the directory. For example, renaming a
* directory on the same {@link FileStore} will usually not require moving
* the entries in the directory. When moving a directory requires that its
* entries be moved then this method fails (by throwing an {@code
* IOException}). To move a <i>file tree</i> may involve copying rather
* than moving directories and this can be done using the {@link
* #copy copy} method in conjunction with the {@link
* #walkFileTree Files.walkFileTree} utility method
如果您尝试在同一分区中移动文件,上面的代码就足够了(即使它有条目也可以移动目录)。如果不是(而不是移动)你需要使用递归作为其他答案提到。
答案 1 :(得分:7)
Files.move()
将有效,前提是文件系统能够移动&#34;文件。这通常要求您移动到同一磁盘上的其他位置。
答案 2 :(得分:4)
最好的方法可能是递归方法,如: 这是我创建的用于将文件移动到临时文件夹的方法。
private boolean move(File sourceFile, File destFile)
{
if (sourceFile.isDirectory())
{
for (File file : sourceFile.listFiles())
{
move(file, new File(file.getPath().substring("temp".length()+1)));
}
}
else
{
try {
Files.move(Paths.get(sourceFile.getPath()), Paths.get(destFile.getPath()), StandardCopyOption.REPLACE_EXISTING);
return true;
} catch (IOException e) {
return false;
}
}
return false;
}
答案 3 :(得分:2)
如果您已经导入了Apache Commons:
FileUtils.moveDirectory(oldDir, newDir);
请注意,newDir
不得预先存在。来自javadocs:
public static void moveDirectory(File srcDir, File destDir) throws IOException
移动目录。 当目标目录位于另一个文件系统上时,请执行“复制和删除”。
参数:
srcDir - 要移动的目录
destDir - 目标目录
抛出:
NullPointerException - 如果源或目标为空 FileExistsException - 如果目标目录存在 IOException - 如果源或目标无效
IOException - 如果发生IO错误,则移动文件
答案 4 :(得分:0)
Java使用本地操作系统操作内置File.renameTo(File dest)。
示例:
new File("/home/alik/Downloads/src").renameTo(new File("/home/alik/Downloads/target"))
答案 5 :(得分:0)
在确定目标路径中的目录已存在之后(例如,通过调用renameTo
,只需使用File
方法(已从JDK的mkdirs()
类中提供) )。
答案 6 :(得分:0)
private static void move(File sourceFile, File destFile) {
if (sourceFile.isDirectory()) {
File[] files = sourceFile.listFiles();
assert files != null;
for (File file : files) move(file, new File(destFile, file.getName()));
if (!sourceFile.delete()) throw new RuntimeException();
} else {
if (!destFile.getParentFile().exists())
if (!destFile.getParentFile().mkdirs()) throw new RuntimeException();
if (!sourceFile.renameTo(destFile)) throw new RuntimeException();
}
}
为我工作
答案 7 :(得分:0)
public static void move(File srcDir, File destDir) throws IOException {
FileUtils.copyDirectory(srcDir, destDir, true);
if(srcDir.isDirectory()) {
for(File file: srcDir.listFiles()) {
FileUtils.forceDelete(file);
}
}
}
来自 org.apache.commons.io 包的 FileUtils;