今天无聊时,写了一个删除工程下面所有的版本文件,即svn文件的小程序。看似简单,
可最终还耗了我不少时间。最后还是剩下几个问题,提出来大家讨论下。
首先,贴出我使用过的删除文件的几种方法:
最常见的删除方法:
/**
* 强制删除文件
*
* @param _file
* @throws Exception
/
private static void FroceDelete(File _file) throws Exception{
try {
_file.delete();
} catch(Exception e) {
// TODO 打印警告信息 文件删除失败
_file.deleteOnExit();
} finally {
if(_file.exists()) {
//TODO 抛出文件删除失败异常
}
}
}
/*
* 通过命令删除文件
*
* @param _file
*/
private static void deleteFileByCommand(File _file) {
Runtime rt = Runtime.getRuntime();
try {
//该命令不能删除这样的文件夹:里面有文件或其它文件夹的文件夹
rt.exec("rd /s/q "+_file.getAbsolutePath());
}catch(IOException e){
e.printStackTrace();
}
}
private static void delete(File _directory) {
if(_directory.isFile()) { //如果为文件则直接删除
_directory.delete();
return;
}
//若果为文件夹 递归遍历删除文件
File[] fileArr = _directory.listFiles();
for(File file:fileArr) {
delete(file);
//顺便问一下,以下面这种方式写为什么编译有问题?希望帮忙解决下
//file.isFile()?file.delete():delete(file);
}
_directory.delete(); //最后删除剩余的空文件夹
}
[quote="XTU_xiaoxin"]居然没人回复 自己赞一个[/quote]
首先我解释下你第3个奇怪的现象吧
在我学dos的时候,我只记得rd是用来删除空目录的,但看了你的问题我在命令行中测试文件是删不了,提示错误如下:The directory name is invalid.
应该用del命令删除文件。
但是你这个程序如果写成 del /s/q 文件路径 +文件名 在命令行下是没问题的。但是在程序里是会抛io异常的,问题在于 del 不是一个application,而是command的内部命令,嵌入在command中的,所以如果要使用Runtime 来执行删除的话,需要在del前面加上 cmd.exe /c,完整的写法如下 : cmd /c del /s/q 路径文件名 或者 cmd /c del 路径文件名
以上
2.这个表达式是需要一个反回值,然后赋值给左边.
值得称赞的理由是...
......这么低级的是事情还能赞???
del *.svn /s
[quote="XTU_xiaoxin"]2. [color=blue]'file.isFile()?file.delete():delete(file);[/color]'为什么编译不过?[/quote]
这条要是能编译通过才奇怪呢,(表达式1)?(表达式1):(表达式3),这三个表达式都必须返回同一种类型。
用Java来做这种事情真是大炮打虾子呀,练习倒是可以~