代码之家  ›  专栏  ›  技术社区  ›  Duncan McArdle

DoToFr..EngSult()在一个尚未存在的路径上总是返回true,因为DoopTrFrue().FasTeReURI.()

  •  0
  • Duncan McArdle  · 技术社区  · 7 年前

    我试图通过使用文档文件(由于存储访问框架)来检查文件在创建之前是否存在。但是 DocumentFile().fromTreeUri() 移除潜在URI的非存在部分,然后导致 DocumentFile().exists() 不管它是否存在,总是返回真实的。

    我创建了一个简单的例子来证明我的观点。首先,我们要求用户选择一个目录:

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // Ask the user for the source folder
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
        startActivityForResult(intent, 100);
    }
    

    在回答问题时,我们补充说 /fictionalFile 到路径(从而使它成为一个不存在的文件),然后检查它是否存在:

    public void onActivityResult(int requestCode, int resultCode, Intent resultData)
    {
        if (resultCode == RESULT_OK)
        {
            if(requestCode == 100)
            {
                Uri fictionalURI = Uri.parse(resultData.getData()+"/fictionalFile");
                DocumentFile fictionalFile = DocumentFile.fromTreeUri(this, fictionalURI);
                Log.i("STORAGE", "FICTIONAL URI: "+fictionalURI);
                Log.i("STORAGE", "FICTIONAL DOCUMENTFILE URI: "+fictionalFile.getUri());
    
                if(fictionalFile.exists())
                {
                    Log.i("STORAGE", "Fictional file exists");
                }
            }
        }
    }
    

    但是,当文档文件.FasTeReURIE()在虚构URI上运行时,假“/FrutoStudio文件”部分丢失,这导致DoTrpField.SufStand()函数返回true,如下面的LogCat所示:

    I/STORAGE:虚构的URI:content://com.android.externalstorage.documents/tree/17FA-1C18%3AFileSync%2Ftarget/虚构的文件

    I/STORAGE:虚构文档文件URI:content://com.android.externalstorage.documents/tree/17FA-1C18%3AFileSync%2Ftarget/document/17FA-1C18%3AFileSync%2Ftarget

    I/St存储:虚构文件存在

    (在上面的例子中,我使用的是SD卡,因此是长路径名)

    是否有另一种方法来检查尚未创建的文档文件是否存在?用例是,当将文件从目录A复制到目录B时,我想在开始传输之前检查目录B中是否已经存在该文件。

    更新: 我现在意识到 DocumentFile.fromTreeUri() 是错误的,我应该使用 DocumentFile.fromSingleUri() . 这有帮助,但在跑步时 .exists() 在我得到的新文件上 W/DocumentFile: Failed query: java.lang.UnsupportedOperationException: Unsupported Uri content://com.android.externalstorage.documents/tree/17FA-1C18%3AFileSync%2Ftarget/fictionalFile . 有什么想法吗?

    public void onActivityResult(int requestCode, int resultCode, Intent resultData)
    {
        if (resultCode == RESULT_OK)
        {
            if(requestCode == 100)
            {
                Uri fictionalURI = Uri.parse(resultData.getData()+"/fictionalFile");
                DocumentFile fictionalFile = DocumentFile.fromSingleUri(this, fictionalURI);
                Log.i("STORAGE", "FICTIONAL URI: "+fictionalURI);
                Log.i("STORAGE", "FICTIONAL DOCUMENTFILE URI: "+fictionalFile.getUri());
    
                if(fictionalFile != null && fictionalFile.exists())
                {
                    Log.i("STORAGE", "Fictional file exists");
                }
            }
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   CommonsWare    7 年前

    鉴于 treeUri 作为 Uri 返回者 ACTION_OPEN_DOCUMENT_TREE ,包装 特雷乌里 在一个 DocumentFile 使用 fromTreeUri() ,然后打电话 findFile() 关于那个 文档文件 提供要查找的显示名称(例如。, fictionalFile ). 如果它回来了 null ,没有与该显示名称匹配的文件。

    借据:

    if (DocumentFile.fromTreeUri(this, treeUri).findFile(whatevs) == null) {
      // TODO: something
    }
    

    不过,请注意,“显示名称”不一定是文件名。