Android: /cache中的文件是怎么消失的

自己放某个文件到/cache分区,重启后发现文件消失了,那么是怎么消失的呢?


Step 1.

packages\providers\DownloadProvider\src\com\android\providers\downloads\StorageManager.java:

/** * Removes files in the systemcache and downloads data dir without corresponding entries in * the downloads database. * This can occur if a delete is done on the database but the file is not removed from the * filesystem (due to sudden death of the process, for example). * This is not a very common occurrence. So, do this only once in a while. */ private void removeSpuriousFiles() { if (true || Constants.LOGV) { Log.i(Constants.TAG, "in removeSpuriousFiles"); } // get a list of all files in system cache dir and downloads data dir List<File> files = new ArrayList<File>(); File[] listOfFiles = mSystemCacheDir.listFiles(); if (listOfFiles != null) { files.addAll(Arrays.asList(listOfFiles)); } listOfFiles = mDownloadDataDir.listFiles(); if (listOfFiles != null) { files.addAll(Arrays.asList(listOfFiles)); } if (files.size() == 0) { return; } Cursor cursor = mContext.getContentResolver().query( Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, new String[] { Downloads.Impl._DATA }, null, null, null); try { if (cursor != null) { while (cursor.moveToNext()) { String filename = cursor.getString(0); if (!TextUtils.isEmpty(filename)) { if (true || Constants.LOGV) { Log.i(Constants.TAG, "in removeSpuriousFiles, preserving file " + filename); } files.remove(new File(filename)); } } } } finally { if (cursor != null) { cursor.close(); } } // delete the files not found in the database for (File file : files) { if (file.getName().equals(Constants.KNOWN_SPURIOUS_FILENAME) || file.getName().equalsIgnoreCase(Constants.RECOVERY_DIRECTORY)) { continue; } if (true || Constants.LOGV) { Log.i(Constants.TAG, "deleting spurious file " + file.getAbsolutePath()); } file.delete(); } } /** A magic filename that is allowed to exist within the system cache */ public static final String KNOWN_SPURIOUS_FILENAME = "lost+found"; /** A magic filename that is allowed to exist within the system cache */ public static final String RECOVERY_DIRECTORY = "recovery";
除 lost+found, recovery这两个目录外的文件都删掉


Setp 2.

frameworks\base\core\java\android\os\RecoverySystem.java:

/** * Called after booting to process and remove recovery-related files. * @return the log file from recovery, or null if none was found. * * @hide */ public static String handleAftermath() { // Record the tail of the LOG_FILE String log = null; try { log = FileUtils.readTextFile(LOG_FILE, -LOG_FILE_MAX_LENGTH, "...\n"); } catch (FileNotFoundException e) { Log.i(TAG, "No recovery log file"); } catch (IOException e) { Log.e(TAG, "Error reading recovery log", e); } // Delete everything in RECOVERY_DIR except those beginning // with LAST_PREFIX String[] names = RECOVERY_DIR.list(); for (int i = 0; names != null && i < names.length; i++) { if (names[i].startsWith(LAST_PREFIX)) continue; File f = new File(RECOVERY_DIR, names[i]); if (!f.delete()) { Log.e(TAG, "Can't delete: " + f); } else { Log.i(TAG, "Deleted: " + f); } } return log; }private static String LAST_PREFIX = "last_";/cache/recovery目录中,除last_开头的文件都删掉


------------------------------------------------

开机走完这两步后幸存的文件只有 /cache/lost+found目录中的文件,及/cache/recovery/last_ 开头的文件了







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值