at java.io.WinNTFileSystem.createFileExclusively
在java开发过程中总是会遇到操纵file类的情况,最常见的需求就是创建文件和文件夹。以下是解决方案:
/**
* 创建文件顺便创建父目录
*
* @param path 文件字符串路径例如d:/fulld/why/ass/a/asd
*/
public static void createFile(String path) {
createFile(new File(path));
}
/**
* 创建文件顺便创建父目录
*
* @param file file类
*/
private static void createFile(File file) {
if (file.exists() && file.isFile()) {
file.delete();
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
return;
}
File parentFile = file.getParentFile();
if (parentFile.exists()) {
if (parentFile.isFile()) {
parentFile.delete();
parentFile.mkdirs();
}
} else {
parentFile.mkdirs();
}
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建文件夹顺便创建父目录
*
* @param path 文件夹的路径字符串例如d:/fulld/why/ass/a/asd/
* @return 如果本来就存在或者创建成功,那么就返回true
*/
public static void mkdirs(String path) {
mkdirs(new File(path));
}
/**
* 创建文件夹顺便创建父目录
*
* @param file file类
*/
public static void mkdirs(File file) {
if (file.exists() && file.isDirectory()) {
return;
}
if (file.exists()) {
file.delete();
file.mkdirs();
} else {
file.mkdirs();
}
}
以上是解决方案,下面是错误演示:
而java API很明显没有直接创建文件不报错的。这里写一个方法来创建文件和文件夹。
public static boolean createFileOrDir(String path) {
return createFileOrDir(new File(path));
}
private static boolean createFileOrDir(File file) {
System.out.println(file.getPath());
if (file.isDirectory()) {
return file.mkdirs();
}
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
System.out.println(parentFile.getPath());
boolean mkdirs = parentFile.mkdirs();
if (!mkdirs)
return false;
} else {
if (!parentFile.isDirectory()) {
boolean delete = parentFile.delete();
boolean mkdirs = parentFile.mkdirs();
if (!delete || !mkdirs) return false;
}
}
try {
return file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
用法也很简单
public class HeHe {
public static void main(String[] args) {
System.out.println(createFileOrDir("d:/fulld/why/ass/a/asd/"));
}
}
然后你就会在你的D盘下面有这么一堆的东西,这里有个问题就是不管你最后加没有/最后一个文件夹没有创建都会默认为文件,如下图:
what the fuck!
用file.getpath也是d:/fulld/why/ass/a/asd而不是d:/fulld/why/ass/a/asd/所以我觉得这个地方是个坑啊,也就是我没有办法保证最后一个创建的是文件夹,如果不存在创建的永远都是文件。mmp真的坑。
然后咱们看看File的mkdirs方法
* @return <code>true</code> if and only if the directory was created,
* along with all necessary parent directories; <code>false</code>
* otherwise
这个注释翻译过来,只有这个子目录单独创建成功的时候才会返回true,又是一个坑。所以返回值都没有什么太大的意义了。
以上是错误示范,经过整理之后就形成了最上面的四个方法。