Orlmite配置文件writeConfigFile出现Could not find raw directory which is typically in the res directory

刚开始出现这个错误有点懵逼,因为代码没改过,ormlite的配置也写了好几个版本了,都没出问题,而且确保项目里的raw文件夹是有的,所以一直不知道问题出在哪里

so上网查了下,so里面有几个答案,有的是让new file一个具体路径的,有一个答案是让在项目外面新建一个res文件夹,然后在res文件夹里在新建一个raw的。这两种方案我都试用成功了,但是很奇怪为什么会出现这种bug,于是接下来就是分析原因了

分析源码过程如下

	/**
	 * Writes a configuration fileName in the raw directory with the configuration for classes.
	 */
	public static void writeConfigFile(String fileName, Class<?>[] classes) throws SQLException, IOException {
		File rawDir = findRawDir(new File("."));
		if (rawDir == null) {
			System.err.println("Could not find " + RAW_DIR_NAME + " directory which is typically in the "
					+ RESOURCE_DIR_NAME + " directory");
		} else {
			File configFile = new File(rawDir, fileName);
			writeConfigFile(configFile, classes);
		}
	}


简单明了,寻找raw文件夹,找到了读取配置文件,没找到报异常,就是我们那个咯,那来看看是怎么找的,接下去分析findRawDir这个函数

	/**
	 * Look for the resource-directory in the current directory or the directories above. Then look for the
	 * raw-directory underneath the resource-directory.
	 */
	protected static File findRawDir(File dir) {
		for (int i = 0; dir != null && i < 20; i++) {
			File rawDir = findResRawDir(dir);
			if (rawDir != null) {
				return rawDir;
			}
			dir = dir.getParentFile();
		}
		return null;
	}

这个函数也不难嘛,往上遍历20层文件目录,看能不能找到raw文件夹,好,继续看看是怎么找raw文件夹的

	/**
	 * Look for the resource directory with raw beneath it.
	 */
	private static File findResRawDir(File dir) {
		for (File file : dir.listFiles()) {
			if (file.getName().equals(RESOURCE_DIR_NAME) && file.isDirectory()) {
				File[] rawFiles = file.listFiles(new FileFilter() {
					@Override
					public boolean accept(File file) {
						return file.getName().equals(RAW_DIR_NAME) && file.isDirectory();
					}
				});
				if (rawFiles.length == 1) {
					return rawFiles[0];
				}
			}
		}
		return null;
	}
恩,简单明了,在当前文件目录下遍历找到res文件夹,找不到返回空,找到res之后继续找raw文件夹

看这整个过程简直无懈可击啊,那问题出在哪儿呢?

可能你已经猜到了,问题出在寻找文件夹的初始文件路径那里,

new File(".")
这个会定位到工程总文件夹的一级子目录,也就是你的.gradle目录,从这个目录往上找,如果找不到res文件夹,当然就更找不到raw文件夹了,那异常就这样发生了

知道原因,那解决方式就很多了,可以选取自己最适合的方式去解决这个小bug


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lindir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值