gpt4 book ai didi

java - 由于 DocumentFile().fromTreeUri() ,尚不存在的路径上的 DocumentFile.exists() 始终返回 true

转载 作者:行者123 更新时间:2023-12-01 19:50:02 24 4
gpt4 key购买 nike

我尝试使用 DocumentFile (由于存储访问框架)在创建文件之前检查文件是否存在。但是DocumentFile().fromTreeUri()删除可能的 Uri 中不存在的部分,这会导致 DocumentFile().exists()始终返回 true,无论它是否存在。

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

@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");
}
}
}
}

但是,当在虚构的 Uri 上运行 DocumentFile.fromTreeUri() 时,假的“/fictionalfile”部分会丢失,这会导致 DocumentFile.exists() 函数返回 true,如下面的 LogCat 所示:

I/STORAGE: FICTIONAL URI: content://com.android.externalstorage.documents/tree/17FA-1C18%3AFileSync%2Ftarget/fictionalFile

I/STORAGE: FICTIONAL DOCUMENTFILE URI: content://com.android.externalstorage.documents/tree/17FA-1C18%3AFileSync%2Ftarget/document/17FA-1C18%3AFileSync%2Ftarget

I/STORAGE: Fictional file exists

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

还有其他方法可以检查尚未创建的 DocumentFile 是否存在吗?用例是,当将文件从目录 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");
}
}
}
}

最佳答案

假设 treeUriACTION_OPEN_DOCUMENT_TREE 返回的 Uri,将 treeUri 包装在 DocumentFile 使用 fromTreeUri(),然后在该 DocumentFile 上调用 findFile(),提供您要查找的显示名称(例如 虚构文件)。如果返回null,则没有与该显示名称匹配的文件。

IOW:

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

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

关于java - 由于 DocumentFile().fromTreeUri() ,尚不存在的路径上的 DocumentFile.exists() 始终返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51661385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com