【问题标题】:Check for file existence in androids assets folder?检查androids资产文件夹中的文件是否存在?
【发布时间】:2010-08-28 23:00:47
【问题描述】:

我的应用在 assets 文件夹的子目录中有 .txt 文件。它读取那些 .txt 文件并将它们放在一个文本视图中。它运行良好,没有问题。

我是否应该担心资产文件夹中的文件被用户删除或丢失。如果发生这种情况,我的应用程序会出错,因为当它尝试将文件读入流时,该文件不存在。

我是否需要在阅读资产文件之前检查它是否存在,或者资产经理是否会处理这一切?我还想知道用户是否有可能会或可以删除​​资产文件。

就像我说的,没有我插入代码来检查文件是否存在,一切都可以正常工作。我只是想知道人们是否在每次从资产中读取流时都使用 .exists() 语句。

【问题讨论】:

    标签: android


    【解决方案1】:

    您可能会担心文件已被删除并且 apk 已退出

    您可以使用以下方式检查:

    Arrays.asList(getResources().getAssets().list("")).contains("myFile")
    

    【讨论】:

    • 当你有唯一的文件名时它可以工作,否则使用natronite解决方案。
    • 我正在设计一个通用应用程序作为一种模板,它可能有也可能没有一些嵌入文件。这个解决方案对我很有用,谢谢! :)
    • @IlyaEremin 非唯一文件名。我很想知道它是如何工作的。
    • 进程太慢了。
    • 此解决方案不列出子文件夹中的文件!
    【解决方案2】:

    如果你真的想检查文件是否存在:

    AssetManager mg = getResources().getAssets();
    InputStream is = null;
    try {
      is = mg.open(pathInAssets);
      //File exists so do something with it
    } catch (IOException ex) {
      //file does not exist
    } finally {
      if (is != null) {
        is.close();
      }
    }
    

    如果您的文件位于assets/folder/file.ext,那么pathInAssets 将是 "folder/file.ext"

    【讨论】:

    • 如果没有失败,你应该关闭打开的流。
    • 好吧,它没有被保存为引用,所以无论如何都应该在方法调用结束时清除返回的输入流
    【解决方案3】:

    理想情况下,在构建 apk 之后,没有人可以从中删除任何资产,但如果有人对其进行反编译并重新编译,这可能是可能的。

    虽然对于其他场景,当资产在运行时不存在于 apk 中时,我们可以检查资产的存在。

    在我们的应用程序中,我们提供了使用 gradle、ant 和 eclipse 构建应用程序的规定,并且对于每种构建机制,我们的一些资产文件捆绑在 apk 中,而另一些则没有,因此要确定是否有任何资产文件存在于运行时的当前构建 apk,

    我们这样做如下:

    private boolean isAssetExists(String pathInAssetsDir){
        AssetManager assetManager = AppContext.get().getResources().getAssets();
        InputStream inputStream = null;
        try {
            inputStream = assetManager.open(pathInAssetsDir);
            if(null != inputStream ) {
               return true;
            }
        }  catch(IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }  
        return false;
    }
    

    【讨论】:

      【解决方案4】:

      是和否。

      普通用户无法删除它们,但使用 root 手机的用户不知道自己在做什么……这是不同的情况。

      如果你问我,不需要额外的代码。此外,如果您尝试打开一个不存在的文件,您将在某个时候抛出异常,如果您真的想要,捕获它并显示一个对话框。

      【讨论】:

      • 太棒了!谢谢克里斯。我确实在代码中进行了“尝试/捕获”交易,但我想知道用户是否能够访问这些资产。嘿,试着说“访问资产”快五倍。哈!
      • 不仅如此——“删除”它们的唯一方法是在没有它们的情况下重建 .apk,这还需要使用不同的证书对其进行签名。如果您因为有人这样做而崩溃,那么他们应得的。 :p
      • 不适用于捆绑的应用程序。用户可能没有该文件夹,因为拆分是可选的。
      • 这个答案很老了。 njzk2 已经有了这个stackoverflow.com/a/7337516/6378928 的答案
      【解决方案5】:

      我认为你应该没事。由于在我的手机中有一个根,我看不到任何删除资产而不删除应用程序的方法,因为它似乎都包含在 .apk 文件中。你可以做到这一点,但我认为你需要root或使用adb。

      为了安全起见,我个人会用 try/catch 块包围任何读/写。

      【讨论】:

        【解决方案6】:
        AssetManager am = getAssets();
        
            try {
                List<String> mapList = Arrays.asList(am.list("path/in/assets/folder"));
        
                if (mapList.contains("file_to_check")) {
                    Log.e("ERROR", "exists");
                } else {
                    Log.e("ERROR", "not exists");
                }
            } catch ( IOException ex){
                ex.printStackTrace();
            }
        

        转换为函数或方法很容易;)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-20
          • 2011-11-15
          相关资源
          最近更新 更多