利用IO流操作文件,如复制,删除等操作时,普通文件比较容易,但是如果涉及目录会相对而言容易出错,最近本人也做到了这方面的东西,所以就总结整理一下:对目录的操作,包括复制删除,最终的本质还是对普通文件的操作,所以递归的思想很有必要。
一、对整个目录的复制:
首先,写一个普通文件的复制方法
public static void copyFile(File src,File sdt)throws Exception{ /*try { InputStream in = null; OutputStream out = null; try { in = new BufferedInputStream(new FileInputStream(src),BUFFER_SIZE); out = new BufferedOutputStream(new FileOutputStream(sdt),BUFFER_SIZE); byte[] buffer = new byte[BUFFER_SIZE]; while (in.read(buffer) > 0){ out.write(buffer); } } finally { if (null != in) in.close(); if (null != out) out.close(); } } catch (Exception e) { }*/ FileInputStream fi = null; FileOutputStream fo = null; FileChannel in = null; FileChannel out = null; try { fi = new FileInputStream(src); fo = new FileOutputStream(sdt); in = fi.getChannel();//得到对应的文件通道-输入流 out = fo.getChannel();//得到对应的文件通道-输出流 in.transferTo(0, in.size(), out);//连接两个通道,并且从in通道读取,然后写入out通道 } catch (IOException e) { e.printStackTrace(); } finally { try { fi.close(); in.close(); fo.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }
被注释掉的部分,是利用缓冲字符流的原理逐行复制的,个人不太建议这种方式,因为操作的过程中发现当源文件有一个空白行时,复制出来的文件会出现NULNULNULNULNUL的字样,并且这种方式效率较低哦!
然后,开始用递归思想写一个复制目录的方法:
public static void copyDirectory(String srcDir, String desDir) { try{ File des = new File(desDir); if(!des.exists()) { des.mkdirs(); } File src = new File(srcDir); File[] files = src.listFiles(); for(File file : files) { //复制文件 if(file.isFile()) { copyFile(file, new File(desDir + "\\" + file.getName())); }else if(file.isDirectory()) {//复制文件夹,递归 copyDirectory(file.getAbsolutePath(), desDir + "\\" + file.getName()); } } }catch(Exception e) { e.printStackTrace(); } }
二、删除目录(文件夹)
同理,也是利用递归的思想,不过,很容易出错:如果直接用file.delete()方法是行不通的,毕竟IO流还没有强大到直接删除整个目录的程度,delete方法只适合删除普通文件。
public static void deleteDir(File file) { if(file.isFile()) { file.delete(); }else if(file.isDirectory()) { File[] list = file.listFiles(); for(File f : list) { deleteFile(f); } } file.delete(); //(1) }
容易出错的地方就是(1)处,按照常理,遍历整个目录,子文件还是一个目录,直接用递归的思想删除不就得了,可是如果没有(1)处的代码,最后的结果将会是所有普通文件都被删除,但是会留下一堆空的文件夹!所以(1)处的代码最容易被遗漏。
三、补充:用Runtime(运行时)运行Linux命令时的注意事项
public static void executeCmd(String cmd){ try { Process p = Runtime.getRuntime().exec(cmd); p.waitFor(); BufferedReader br =new BufferedReader(new InputStreamReader(p.getInputStream())); String line = null; while((line = br.readLine()) != null) { System.out.println(line); } p.getInputStream().close(); p.getOutputStream().close(); p.getErrorStream().close(); } catch(Exception e) { // log.debug(e.getMessage()); // log.error("ERROR#"+e.fillInStackTrace()); e.printStackTrace(); }
需要注意的是,调用这个工具方法会达到在Java程序中运行CMD命令的效果,不过需要注意的一些地方:
1)如果某一命令比如aapt.bat /apktool.bat等没有被加入环境变量中时,最好在命令中加上他们所在的路径,如:
String cmd = "F:\\aptool工具\\apktool\\apktool.bat b D:\\apk\\xxx.apk"; executeCmd(cmd);
如果加上了环境变量,就可以直接这样写:
String cmd = "apktool.bat b D:\\apk\\xxx.apk";
所以比较保险的做法是加上命令所在路径,因为不一定你就会专门去配环境变量!
2)命令要加后缀如.bat,否则会识别不了(cmd窗口中可以没有后缀,但是如果利用Runtime运行,最好加上),导致报错。
3)操作得到的结果会保存在Java程序所在项目的磁盘路径,而不是dos窗口里的前缀路径!
相关推荐
该命名空间包含了大量用于处理文件和目录的类,比如`DirectoryInfo`、`FileInfo`、`FileStream`等。 ##### 1.2 FileInfo和DirectoryInfo类 - **FileInfo**:表示一个物理文件的抽象,提供了获取文件属性、读写文件...
总之,Windows下使用C语言实现文件和文件夹的复制删除命令是一个综合性的任务,涉及到文件系统操作、通配符处理、目录树遍历、用户交互以及错误处理等多个方面。通过实践,开发者可以增强对操作系统API的掌握,提升...
2. 目录API:Windows API提供了诸如CreateDirectory、RemoveDirectory、CopyFile、MoveFile等函数,用于创建、删除和移动文件或目录。 二、文件夹复制 1. 使用SHFileOperation:这是Windows Shell API中的一个函数...
文件夹复制的实现则更加复杂,这里定义了一个名为`qCopyDirectory`的函数,它负责递归地复制文件夹中的所有内容,包括子文件夹和文件。 此函数接收四个参数:源目录`fromDir`、目标目录`toDir`、一个布尔值`...
为了实现文件夹的复制,可以使用递归函数qCopyDirectory,该函数将源文件夹的所有文件和子文件夹复制到目标文件夹中。 函数qCopyDirectory的原型为: ```c bool qCopyDirectory(const QDir& fromDir, const QDir& ...
文件夹复制则涉及整个目录结构的复制,包括文件夹内的所有子文件夹和文件。与文件复制类似,用户可以通过图形界面或者命令行工具进行操作。Windows的“复制”和“粘贴”功能同样适用于文件夹,但更推荐使用“发送到...
源码 复制和删除整个文件夹的例子,分别采用了通过WinBase.h中的基本操作函数和ShlwApi.h中的SHFileOperation来实现文件夹的复制和删除操作。 工程中包含VC6.0和VS2010两个版本。
本教程将详细介绍如何在这样的环境下遍历文件夹、复制文件、删除文件以及复制文件内容。 一、遍历文件夹 在C#中,我们可以使用`System.IO`命名空间下的`DirectoryInfo`类来遍历文件夹。以下是一个简单的示例: ``...
在文件系统操作中,如删除文件夹或复制文件夹,递归尤其有用,因为文件夹通常包含其他文件和子文件夹,它们也可能含有更多的文件和子文件夹,形成一个嵌套结构。本篇文章将深入探讨递归在删除和复制文件夹中的应用。...
### 如何将一个文件夹复制到另一个文件夹中并保留其权限 在计算机管理与维护过程中,经常需要进行文件或文件夹的复制操作。对于Windows系统用户而言,复制时保持原有的文件权限设置是非常重要的,尤其是在涉及到...
在IT领域,特别是编程与文件操作方面,"vb复制整个文件夹到指定位置"这一主题涉及到了使用Visual Basic(简称VB)进行文件夹复制的技术细节。以下是对该知识点的深入解析,包括VB代码示例、函数解释以及相关概念的...
在Java编程语言中,文件和文件夹的复制是一项常见的任务,尤其在系统迁移、数据备份或者软件部署等场景中。本教程将详细讲解如何使用...通过理解这些概念和实践,你将能够有效地在Java程序中处理文件和目录的复制任务。
这个过程需要遍历源文件夹中的所有文件和目录,并将其复制到目标文件夹内。在C#中,我们可以使用Directory和File类来实现文件夹的复制。 首先,我们需要检查目标目录是否存在,如果不存在则新建之。然后,我们可以...
文件夹复制病毒是一种常见的计算机恶意软件,它会自我...总之,对付文件夹复制病毒需要综合运用防病毒软件、安全习惯和数据备份等手段。用户应该提高网络安全意识,时刻警惕潜在的威胁,保护好自己的电脑和数据安全。
如果直接使用`RD /S /Q c:\temp`命令来删除`C:\temp`目录下的所有文件和子文件夹,则会连同`temp`目录本身一起删除。 ```batch rd /s /q c:\temp ``` #### 方法二:变通使用`RD`命令 为了避免删除`temp`目录本身...
记得在项目中引用`System.IO`命名空间,这是处理文件和目录操作所需的基本库。 总的来说,"从a文件夹到b文件夹文件复制"是一个典型的文件操作问题,涉及到文件和文件夹的验证、遍历、复制、删除以及在WinForms中的...
在IT领域,编程任务经常涉及到对文件和文件夹的操作,如复制、删除和移动。本教程将详细讲解如何使用Visual Basic 6.0(VB6)通过API(应用程序接口)函数来实现这些功能,尤其针对一个文件夹下所有文件和子文件夹的...
总的来说,理解和掌握C#中的文件和目录操作对于任何C#开发者都是至关重要的,这使得他们能够有效地处理存储在文件系统中的数据和资源。通过使用递归和`System.IO`类库,我们可以创建强大的文件管理工具,满足各种...
标题中的“自动建立硬件项目文件夹目录参考”指的是创建一个自动化流程,用于系统化地组织和存储硬件项目的相关文件。这种做法有助于提高工作效率,确保文件的有序性,并方便后期查找和管理。 描述部分提到,这是一...
例如,要将 F 盘的 file 文件夹复制到 C 盘根目录,可以使用以下命令: xcopy f:file c:file /e 其中,xcopy 是复制命令,f:file 是源文件夹,c:file 是目标文件夹,/e 是参数,表示复制文件夹及其子文件夹。 ...