首页 > 解决方案 > 内部文件在 Android 上不“可用” - File.exists() 对任何文件都返回 false

问题描述

我正在尝试访问存储在内部存储中的 2.45GB Geopackage 文件,但每当我尝试访问它时,我都会收到“文件不存在”错误。

gpkg 文件正在通过 DownloadManager 下载到外部存储中,然后再复制到内部存储中,但是当我调用 时new File(getContext().getFilesDir(), "roads.gpkg").exists();,我得到“假”返回。不仅如此,当我跑步时

File[] files = getContext().getFilesDir().listFiles();
for(File file : files){
    Log.i("FILE", file.getAbsolutePath());
}

该文件不显示。

为了确保这不是来自 DownloadManager 或我的复制方法的意外行为,我手动将文件复制到“Android/data/uk.co.alexks.greenroutes/files”,以及一个 11 字节的 txt 文件,'test .txt',使用我的 Windows 笔记本电脑。同样,对于上面的 listFiles() 代码输出,这些文件都没有返回 trueFile.exists()或显示(见下文)。

这是我尝试访问文件时的完整代码:

File geopackage = new File(getContext().getFilesDir(), "roads.gpkg");
Log.i("GEOPACKAGE", String.format("GPKG File: %s", geopackage.getPath()));
Log.i("GEOPACKAGE", String.format("Exists? %s", geopackage.exists()?"T":"F"));

Log.i("FILE", getContext().getFilesDir().getPath());
File[] files = getContext().getFilesDir().listFiles();
for(File file : files){
   Log.i("FILE", file.getAbsolutePath());
}

//Pass geopackage to a new object that uses the Geopackage-Android library to handle it.

这是 Logcat 输出:

I/GEOPACKAGE: GPKG File: /data/user/0/uk.co.alexks.greenroutes/files/roads.gpkg
I/GEOPACKAGE: Exists? F
I/FILE: /data/user/0/uk.co.alexks.greenroutes/files
    /data/user/0/uk.co.alexks.greenroutes/files/DATA_disk_creation_time_its
    /data/user/0/uk.co.alexks.greenroutes/files/DATA_disk_creation_time_vts_labl_uk.co.alexks.greenroutes_default
    /data/user/0/uk.co.alexks.greenroutes/files/DATA_disk_creation_time_vts_no_pois_uk.co.alexks.greenroutes_default
    /data/user/0/uk.co.alexks.greenroutes/files/DATA_disk_creation_time_vts_uk.co.alexks.greenroutes_default
    /data/user/0/uk.co.alexks.greenroutes/files/DATA_disk_creation_time_vts_inaka_uk.co.alexks.greenroutes_default
    /data/user/0/uk.co.alexks.greenroutes/files/DATA_disk_creation_time_its_ter
    /data/user/0/uk.co.alexks.greenroutes/files/com.google.android.gms.maps._m_u
    /data/user/0/uk.co.alexks.greenroutes/files/_m_t
I/FILE: /data/user/0/uk.co.alexks.greenroutes/files/DATA_ServerControlledParametersManager.data.uk.co.alexks.greenroutes
    /data/user/0/uk.co.alexks.greenroutes/files/ZoomTables.data

和预期的输出:

I/GEOPACKAGE: GPKG File: /data/user/0/uk.co.alexks.greenroutes/files/roads.gpkg
I/GEOPACKAGE: Exists? T
I/FILE: /data/user/0/uk.co.alexks.greenroutes/files
    /data/user/0/uk.co.alexks.greenroutes/files/roads.gpkg
    /data/user/0/uk.co.alexks.greenroutes/files/test.txt

我的 Android 清单具有以下权限:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

对于它的价值,我知道我应该使用 File.isFile() 来检查文件是否有效,但这在这里没有帮助。

任何帮助将不胜感激!:)

标签: javaandroidfileinternal-storagegeopackage

解决方案


好的,事实证明该文件确实不存在于内部存储中(我想我卸载了该应用程序以测试权限请求,但我在“Android/data/package/files/”(外部存储)中看到了数据集的副本所以认为它确实存在),正如@CommonWares 在评论中指出的那样,从 Windows 可见的 Android/data/package/files 文件夹不是内部存储,它是外部存储,因此将文件复制到那里什么也没做。


推荐阅读