You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:54:57