检查下载中的自定义文件夹中是不是存在文件 - 不推荐使用 getExternalStoragePublicDirectory

Posted

技术标签:

【中文标题】检查下载中的自定义文件夹中是不是存在文件 - 不推荐使用 getExternalStoragePublicDirectory【英文标题】:Check if file exist inside custom folder in Downloads - getExternalStoragePublicDirectory deprecated检查下载中的自定义文件夹中是否存在文件 - 不推荐使用 getExternalStoragePublicDirectory 【发布时间】:2020-12-16 18:32:14 【问题描述】:

我想要实现的是在下载之前检查文件是否存在,这样我就不必再次重新下载它。例如,我必须第一次打开来自互联网“history-of-comics.pdf”的这个 pdf,为此我必须下载它并在我的应用程序中打开,第二次我选择重新-阅读它,我必须确定“history-of-comics.pdf”是否存在于 Downloads/MyDocs 中,我不必浪费资源让用户等待再次下载。目前应用程序 targetSdkVersion 是 29,到目前为止我所做的是:

    授予 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 的权限 包含在清单 android:requestLegacyExternalStorage="true" 应用标签内 在 MyDocs 中的 Downloads 文件夹中下载 pdf 文件

下面是我的代码的快速示例(我已经评论了我尝试过的其他组合):

 private void checkIfPdfExists(String pdfFileName) 
        String uriFile = String.valueOf(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS+File.separator+"MyDocs"+File.separator+pdfFileName+".pdf"));
        File file = new File(uriFile);
        
        //File file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)+"/MyDocs", pdfFileName+".pdf");
        //File file = new File(Environment.DIRECTORY_DOWNLOADS+File.separatorChar+"MyDocs"+File.separatorChar+pdfFileName+".pdf");
        //File file = new File(Environment.DIRECTORY_DOWNLOADS+File.separatorChar+"MyDocs", pdfFileName+".pdf");
        if (file.exists() && file!=null) 
            Toast.makeText(getApplicationContext(), file.getPath() + "/n exists", Toast.LENGTH_SHORT).show();
            displayFromUri(Uri.parse(file.getPath()));
         else 
            beginDownload("https://www.heritagestatic.com/comics/d/history-of-comics.pdf",pdfFileName);
        
    

这就是我在下载 pdf 时定义路径的方式,下载器可以正常工作:

 DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        request.addRequestHeader("Accept", "application/pdf");
        request.setDescription(file_name);
        request.setTitle("Getting your doc");
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,"MyDocs/"+file_name+".pdf");

我在发布问题之前做了一些研究,在一些线程中我发现与 Android Q 相关,但我找不到真正的解决方案。任何帮助将不胜感激,在此先感谢!

【问题讨论】:

文件 file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTOR_DOWNLOADS), "MyDocs/Pdffilename.pdf"); 您唯一的问题是使用正确的文件路径。 if (file.exists() && file!=null) 那应该是if ((file!=null ) && file.exists()) 否则,如果文件为空,您仍然会收到 NullPointerException。但是您可以更好地删除检查,因为文件永远不会为空。 @blackapps 非常感谢您的帮助。你告诉我的方法似乎工作正常,唯一的“问题”是“getExternalStoragePublicDirectory”已被弃用,我正在开发的应用程序正在很多 Android Q 和 Android R beta 中进行测试,这就是我包含 Q在主题。我尝试使用“context.getExternalFilesDir”而不是“Environment.getExternalStoragePublicDirectory”,但它总是返回这个文件存在,同时它不存在。你能给我一些关于这方面的指示吗?再次感谢! 场景如下。如果您可以使用并使用setDestinationInExternalPublicDir(),那么您与getExternalStrorageDirectory() 核对。如果您下载到setDestinationInExternalFilesDir() ,则使用getExternalFilesDir()。以此类推。 【参考方案1】:

我的问题的解决方案是我如何引用文件路径和用于下载的方法。正如@blackapps 提到的,如果您使用“setDestinationInExternalFilesDir”保存文件,则检查文件是否存在的正确方法是使用“getExternalFilesDir”,在我的情况下:

 File file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)+File.separator+"MyDocs"+File.separator+pdfFileName+".pdf");

【讨论】:

以上是关于检查下载中的自定义文件夹中是不是存在文件 - 不推荐使用 getExternalStoragePublicDirectory的主要内容,如果未能解决你的问题,请参考以下文章

在swift中的自定义标题中获取具有文件大小的下载文件的进度

SaveFileDialog 上的自定义检查文件名

R:检查“今天的”文件是不是存在,如果不存在,请下载

检查 iOS 8 的自定义键盘中的输入文本是不是为空

检查是不是存在上传的文件,显示按钮以查看和下载文件

更新woocommerce后,woocommerce文件夹中的文件(与主题集成)无法正常工作