从Assets复制数据库失败:ENOENT文件或目录不存在错误求助
解决Assets数据库复制到数据目录的ENOENT错误
你遇到的ENOENT (No such file or directory)错误,核心原因是**getDatabasePath()返回的路径里的databases目录还没创建**——Android系统不会自动帮你生成这个目录,直接往不存在的目录里写文件自然会失败。
先梳理下你原有代码的问题:你直接通过getDatabasePath(db_file).getPath()拿到了文件路径,但这个路径里的/databases/目录可能还不存在,所以创建FileOutputStream的时候就会触发报错。
修复方案
我们需要先检查并创建databases目录,再执行文件复制操作。修改后的完整代码如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String db_file = "word504.db"; // 先获取数据库所在的目录,而非直接拿文件路径 File dbDir = this.getDatabasePath(db_file).getParentFile(); // 如果目录不存在,递归创建所有缺失的父目录 if (!dbDir.exists()) { dbDir.mkdirs(); } String db_path = dbDir.getAbsolutePath() + "/" + db_file; File dbFile = new File(db_path); if (!dbFile.exists()) { try { copyFileFromAssets(db_file, db_path); } catch (IOException e) { Log.e("DB_COPY_ERROR", "复制数据库失败: " + e.getMessage()); } } } private void copyFileFromAssets(String name, String dest) throws IOException { InputStream mInput = this.getAssets().open(name); OutputStream mOutput = new FileOutputStream(dest); byte[] mBuffer = new byte[1024]; int mLength; while ((mLength = mInput.read(mBuffer)) > 0) { mOutput.write(mBuffer, 0, mLength); } mOutput.flush(); mOutput.close(); mInput.close(); } }
关键修改点说明
- 先创建数据库目录:通过
getParentFile()拿到databases目录,用mkdirs()确保目录存在(这个方法会递归创建所有缺失的父目录,比mkdir()更稳妥) - 调整路径拼接逻辑:先拿到目录路径,再拼接文件名,避免路径拼接出错
- 优化日志标签:把原来的无意义星号改成清晰的标签,方便后续排查问题
这样修改后,系统会先创建好/data/data/org.zanjan.words504/databases/目录,再执行数据库文件的复制,就不会出现ENOENT错误了。
内容的提问来源于stack exchange,提问作者Vaheed01
相关产品推荐
相关产品推荐

