是否可以从资产文件中获取上次修改日期?

Posted

技术标签:

【中文标题】是否可以从资产文件中获取上次修改日期?【英文标题】:Is it possible to get last modified date from an assets file? 【发布时间】:2011-07-12 00:14:47 【问题描述】:

奇怪的问题:是否可以在 assets 文件夹中获取文件的最后修改日期,还是没有意义和不可能?

我问是因为我在应用程序启动时将只读数据库从那里复制到数据文件夹中,但宁愿仅在现有文件比资产文件夹中存储的文件旧时执行复制(或如果文件不存在)。

如果这不可能,有人知道更好的约定吗?如果需要,我可以将其发布在一个单独的问题中。蒂亚!

【问题讨论】:

对于其他想知道的人:答案是否定的。我自己使用版本命名约定和正则表达式来解析和确定文件的版本。 你能多描述一下你是怎么做到的吗? 【参考方案1】:

数据库有多大/有多复杂?您可能会发现使用SQLiteOpenHelper 的实例来处理此问题更容易、更灵活,因为只需调用getReadableDatabase(),它就会在必要时创建数据库,并调用onUpgrade 为您升级数据库。

您所要做的就是提供onCreate() 来创建数据库,提供onUpgrade() 来升级,并在数据库版本发生变化时递增(在onUpgrade() 中),android 将处理创建和升级数据库你。

或者,(我还没有尝试过),看起来AssetManager.list() 可以为您提供资产的路径列表,接下来,使用File (String path) 获取数据库的文件对象,最后@ 987654329@获取修改日期。

【讨论】:

我已经在扩展 SQLiteOpenHelper,但如果可能的话,我不想在代码或 XML 中包含数据库版本——我想要一种比较数据库本身的方法。或者我想我可以将版本存储在数据库中,但是我每次都必须将新数据库复制到数据文件夹中才能打开它并查看它有多新,所以我不妨覆盖每个案例。 哦,我很确定您无法从 AssetManager 打开文件,我认为它必须是 InputStream。但也许我错了? 不,实际上我认为你是对的。不幸的是,您似乎必须在共享首选项或数据库中存储某种标志,以确定是否需要覆盖正在使用的数据库。 酷,我已经使用了版本命名约定。感谢您抽出宝贵时间。【参考方案2】:

嘿,我遇到了和你一样的问题。只有当它更新时,我才想复制和资产。所以我让 sharedPreferences 存储了最后安装的版本,并用它来比较日期:

我在 strings.xml 文件中添加一个条目来保存应用程序版本:

<string name="version">0.3</string>

然后我在主类的onCreate方法上放了一个if子句:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if( Float.parseFloat(getString(R.string.version)) > prefs.getFloat("LastInstalledVersion", (float) 0.0 ) ) 
                copyfiles();

我将新版本字符串添加到 onPause 方法的 sharedPreferences 中,这样在再次调用 onCreate 之前肯定会添加它:

SharedPreferences prefs= PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = prefs.edit();
editor.putFloat("LastInstalledVersion", Float.parseFloat(getString(R.string.version)) );
editor.commit();

可能比在文件本身中使用版本名称更简单。

请注意,如果您的版本高于 0.0,则 copyfiles 将在第一次打开应用程序时运行,并且只有在以后的版本中增加版本字符串时才会再次运行。

请记住,此示例仅适用于您要比较单个文件或不关心单个文件版本的情况。否则,您可以使用几个不同的字符串来存储文件版本。

【讨论】:

【参考方案3】:

对于只读资产,我尝试使用文件时间戳 (f.lastModified() / f.setSetModified(timestamp)),但它不起作用因为f.setSetModified(timestamp) 起作用不适用于安卓。至少,在我使用的 2.3.4 上。

见https://***.com/a/13996418/755804

【讨论】:

【参考方案4】:

我创建了一个构建任务,它保存所有资产文件的最后修改日期并将其保存到资产目录中的新文件lastModified.txt。只需将其放在build.gradle 的底部即可。仔细检查资产目录的路径。

task saveAllAssetDate 
    def assetDirectory = "src/main/assets";
    def text = ""
    fileTree(assetDirectory).visit  FileVisitDetails details ->
        def name = details.file.path;
        name = name.substring(name.indexOf("assets"));
        text += details.getLastModified() + " " + name + "\n"
    
    file(assetDirectory + "/lastModified.txt").text = "" + text

build.dependsOn saveAllAssetDate

【讨论】:

以上是关于是否可以从资产文件中获取上次修改日期?的主要内容,如果未能解决你的问题,请参考以下文章

sap固资折旧日期为啥选完那天显示的不是那天

是否可以直接从 OpenSL ES(适用于 Android)中的音频资产获取字节缓冲区?

获取 Angular 资产文件夹中所有 svg 文件的列表

资产监测设备使用时,设置具体指定日期天数计算

DataLake 文件 - 上次修改日期时间

是否可以从资产文件夹中加载可绘制对象?