【问题标题】:Something is deleting image files from getExternalFilesDir()?某些东西正在从 getExternalFilesDir() 中删除图像文件?
【发布时间】:2019-07-03 00:48:19
【问题描述】:

我很难弄清楚我的应用发生了什么。各种用户报告说应用程序生成的图像文件已经消失。但是,数据库数据并没有消失,而是存储在公共位置Context.getDatabasePath()。此外,所有文件夹都完好无损,只是缺少图像。

所以我认为 Android 中有一些例行程序导致了这种情况?或者其他一些清理 *.png 文件的应用程序?我知道我的应用不会删除它们,因为我没有任何例程来递归删除所有图像文件。

另外,父文件夹有 .nomedia 文件,所以所有子文件夹都不应该被图库触及,对吧?

我将这些文件存储在以下路径结构中,其中 %d 是唯一编号:

getExternalFilesDir()/projects/p_%d/l_%d/%d.png

这就是我创建项目路径的方式:

public static File getProjectsDir(Context context)
{
    // External app directory handled by the OS. Meaning that when the app is uninstalled all
    // the data inside this folder will be also removed.
    File appRoot = context.getExternalFilesDir(null);
    if (null == appRoot) {
        Log.e(TAG,"getProjectsDir() -> External storage not accessible!");
        return null;
    }

    File projectsDir = new File(appRoot, "projects");

    // create projects directory
    if (!projectsDir.exists()) {
        if (!projectsDir.mkdir()) {
            Log.e(TAG,"getProjectsDir() -> Unable to create projects folder!");
            return null;
        } else {
            File noMediaFile = new File(projectsDir, ".nomedia");
            if (!noMediaFile.exists()) {
                try {
                    if (!noMediaFile.createNewFile()) {
                        Log.e(TAG,"getProjectsDir() -> no media file failed to be created!");
                    }
                } catch (IOException e) {
                    Log.e(TAG,"getProjectsDir() -> no media file failed to be created!",e);
                }
            }
        }
    }

    return projectsDir;
}

【问题讨论】:

  • “所以我认为 Android 中的某些程序会导致这种情况?” - 我不知道标准 Android 中有任何东西会从那里删除文件,而不是根据用户请求(例如,设置中的“清除数据”)。缓存目录可以自动清除,至少在存储空间不足的情况下。 “或者其他一些清理 *.png 文件的应用程序?” - 使用外部存储,这当然是可能的。您可以考虑在您的应用程序中添加一些针对这种情况的自动检查,然后将其记录在您可以获取设备详细信息的位置(例如,ACRA 中的静默异常),以寻找共同特征。
  • "父文件夹有 .nomedia 文件,所以所有子文件夹都不应该被图库触及,对吧?" -- 这充其量只是一个约定。
  • @CommonsWare 感谢您的帮助。所以“清除缓存”不会删除我可以确认的项目图像。此外,“CLEAR DATA”会导致数据库和项目文件被删除。所以用户没有做任何这些或操作系统。
  • 我有跟踪崩溃的分析,例如 ACRA...但是你建议我做什么样的自动检查?诸如监听文件删除之类的东西?一些细节会很棒!谢谢。
  • “但是你建议我做什么样的自动检查?” -- 当您的应用程序启动时,根据文件系统验证数据库。如果数据库说应该有一个图像,其中%d 是 123,并且没有这样的图像,那么有些东西在你背后删除了那个图像。如果没有图像存在,则所有图像都已删除,这可能值得记录。

标签: android


【解决方案1】:

根据this,DownloadManager 似乎删除了超过 7 天未访问的第三方应用程序中的所有文件(即“UI-Visible”)。

解决方法是在文件下载后重命名文件,以便 DownloadManager 无法再跟踪它。

【讨论】:

  • 没错!感谢您的参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 2023-03-27
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多