【Java】移动文件夹及其所有子文件与子文件夹

在Java移动文件夹及其所有子文件与子文件夹可以有如下的一段简单的方法来说明:

public static void moveFolder(String oldPath, String newPath) {
	//先复制文件
	copyFolder(oldPath, newPath);
	//则删除源文件,以免复制的时候错乱
	deleteDir(new File(oldPath));
}

不应该直接剪切文件,防止在剪切的时候出错,导致这样那样的问题。

在Java复制文件夹及其所有子文件与子文件夹,在《【Java】利用文件输入输出流完成把一个文件夹内的所有文件拷贝的另一的文件夹的操作》(点击打开链接)一文中已经详细说过了。

关键是删除文件夹及其子文件与子文件夹。

在Java中,File类的delete()方法只能删除为空的文件夹或者单个文件,因此必须遍历整个文件夹,先从最内层的文件夹中的文件开始,进行递归删除,具体方法如下:

// 删除某个目录及目录下的所有子目录和文件
public static boolean deleteDir(File dir) {
	// 如果是文件夹
	if (dir.isDirectory()) {
		// 则读出该文件夹下的的所有文件
		String[] children = dir.list();
		// 递归删除目录中的子目录下
		for (int i = 0; i < children.length; i++) {
			// File f=new File(String parent ,String child)
			// parent抽象路径名用于表示目录,child 路径名字符串用于表示目录或文件。
			// 连起来刚好是文件路径
			boolean isDelete = deleteDir(new File(dir, children[i]));
			// 如果删完了,没东西删,isDelete==false的时候,则跳出此时递归
			if (!isDelete) {
				return false;
			}
		}
	}
	// 读到的是一个文件或者是一个空目录,则可以直接删除
	return dir.delete();
}
因此,整个方法连起来就是这个样子,把C盘下的A文件夹及其所有子文件与子文件夹,移动到F盘,并且重新命名:

import java.io.*;

public class CutTest {
	// 删除某个目录及目录下的所有子目录和文件
	public static boolean deleteDir(File dir) {
		// 如果是文件夹
		if (dir.isDirectory()) {
			// 则读出该文件夹下的的所有文件
			String[] children = dir.list();
			// 递归删除目录中的子目录下
			for (int i = 0; i < children.length; i++) {
				// File f=new File(String parent ,String child)
				// parent抽象路径名用于表示目录,child 路径名字符串用于表示目录或文件。
				// 连起来刚好是文件路径
				boolean isDelete = deleteDir(new File(dir, children[i]));
				// 如果删完了,没东西删,isDelete==false的时候,则跳出此时递归
				if (!isDelete) {
					return false;
				}
			}
		}
		// 读到的是一个文件或者是一个空目录,则可以直接删除
		return dir.delete();
	}

	// 复制某个目录及目录下的所有子目录和文件到新文件夹
	public static void copyFolder(String oldPath, String newPath) {
		try {
			// 如果文件夹不存在,则建立新文件夹
			(new File(newPath)).mkdirs();
			// 读取整个文件夹的内容到file字符串数组,下面设置一个游标i,不停地向下移开始读这个数组
			File filelist = new File(oldPath);
			String[] file = filelist.list();
			// 要注意,这个temp仅仅是一个临时文件指针
			// 整个程序并没有创建临时文件
			File temp = null;
			for (int i = 0; i < file.length; i++) {
				// 如果oldPath以路径分隔符/或者\结尾,那么则oldPath/文件名就可以了
				// 否则要自己oldPath后面补个路径分隔符再加文件名
				// 谁知道你传递过来的参数是f:/a还是f:/a/啊?
				if (oldPath.endsWith(File.separator)) {
					temp = new File(oldPath + file[i]);
				} else {
					temp = new File(oldPath + File.separator + file[i]);
				}

				// 如果游标遇到文件
				if (temp.isFile()) {
					FileInputStream input = new FileInputStream(temp);
					// 复制并且改名
					FileOutputStream output = new FileOutputStream(newPath
							+ "/" + "rename_" + (temp.getName()).toString());
					byte[] bufferarray = new byte[1024 * 64];
					int prereadlength;
					while ((prereadlength = input.read(bufferarray)) != -1) {
						output.write(bufferarray, 0, prereadlength);
					}
					output.flush();
					output.close();
					input.close();
				}
				// 如果游标遇到文件夹
				if (temp.isDirectory()) {
					copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);
				}
			}
		} catch (Exception e) {
			System.out.println("复制整个文件夹内容操作出错");
		}
	}

	public static void moveFolder(String oldPath, String newPath) {
		// 先复制文件
		copyFolder(oldPath, newPath);
		// 则删除源文件,以免复制的时候错乱
		deleteDir(new File(oldPath));
	}

	public static void main(String[] args) {
		moveFolder("c:/A", "f:/B");
	}

}




Java中,可以使用`java.nio.file`包中的`Files`和`Paths`类来移动文件夹及其所有文件文件夹到指定目录。以下是具体步骤: 1. 首先,使用`Files.walk(Path start, FileVisitOption... options)`方法遍历要移动文件夹下的所有文件文件夹。这个方法会返回一个`Stream<Path>`对象,表示遍历到的路径集合。 2. 然后,通过`Path.resolve(Path other)`方法结合`Files.move(Path source, Path target, CopyOption... options)`方法来移动每一个文件文件夹到目标目录。 下面是一个实现的示例代码: ```java import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.EnumSet; import java.util.Set; public class MoveFolder { public static void moveFolder(Path sourceFolder, Path targetFolder) throws IOException { // 检查目标目录是否存在,不存在则创建 if (!Files.exists(targetFolder)) { Files.createDirectories(targetFolder); } // 遍历源目录,并移动每个文件目录到目标目录 Files.walk(sourceFolder, FileVisitOption.FOLLOW_LINKS) .forEach(sourcePath -> { Path targetPath = targetFolder.resolve(sourceFolder.relativize(sourcePath)); try { Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { e.printStackTrace(); } }); } public static void main(String[] args) { Path source = Paths.get("/path/to/source/folder"); Path destination = Paths.get("/path/to/destination/folder"); try { moveFolder(source, destination); } catch (IOException e) { e.printStackTrace(); } } } ``` 请注意,在移动文件夹之前,你需要处理一些可能的情况,例如: - 如果目标路径中已存在同名文件文件夹,你需要决定是覆盖还是跳过或重命名。 - 需要确保有足够的权限执行移动操作。 - 确保程序能够处理移动过程中可能出现的异常。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值