1

我的 Android 应用程序必须检查文件系统上是否已存在文件夹 Uri(父文件夹已由用户选择,因此已获得授权)。以下代码旨在执行检查:

static public boolean folderExists(Activity activity,String folderUriString)
{
ContentResolver contentResolver;
contentResolver = activity.getContentResolver();

Log.d("folder name",folderUriString); // it's content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Faccesspoint1/subfoldername
Uri folderUri = Uri.parse(folderUriString);
boolean isTreeUri=DocumentsContract.isTreeUri(folderUri);
boolean exists = DocumentFile.fromTreeUri (activity,folderUri).exists();

Log.d("is treeUri",String.valueOf(isTreeUri)); //true
Log.d("folder exists",String.valueOf(exists)); //true

return exists;
}

此代码不起作用,因为如果文件夹不存在(从未创建,或创建和删除),即使父文件夹本身不存在,它也会产生真值。

请注意,该 uri 肯定还不存在。我使用设备上的文件系统应用程序来检查目录。

uri 字符串是通过以下方法创建的:

public static String appendUriString(String originalUriString,String appendedUriPath)
{
    String result;
    Uri uri=Uri.parse(originalUriString);
    result=Uri.withAppendedPath(uri,appendedUriPath).toString();
Log.d("appendUri",result);    
    return result;
}

content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Faccesspoint1/subfoldername

如您所见,生成的 uri 是包含编码和非编码符号的混合形式,因此它是合法的,因为 SAF 方法创建了完整的 uri。

不同版本的 folderExists 方法将 uri 字符串拆分为具有父文件夹。但我认为应该在没有这个技巧的情况下验证 uri。为什么它不起作用?什么是正确的代码?

4

3 回答 3

1

如果你想知道一个文件夹是否存在,声明Uriand a DocumentFile,然后使用findFile()onDocumentFile来查看它null是否存在(即不存在)。如果是null,请创建文件夹。这是一个例子:

Uri treeUri = muri;
DocumentFile root = DocumentFile.fromTreeUri(this, treeUri);
if (root.findFile("Foldername") == null) { //create folder }
于 2022-01-31T02:40:49.603 回答
0

尝试使用fromSingleUri而不是fromTreeUri. 也可能值得检查 fetched 是否DocumentFile isDirectory真的。

static public boolean folderExists(Activity activity, String folderUriString) {
    Log.d("folder name",folderUriString); // it's content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Faccesspoint1/subfoldername
    Uri folderUri = Uri.parse(folderUriString);
    DocumentFile pickedDir = DocumentFile.fromSingleUri(activity, folderUri);

    return pickedDir != null && pickedDir.exists();
}
于 2019-10-01T09:32:28.193 回答
0

(我忽略了关于“/subfoldername”是否有效或应该是“%2Fsubfoldername”的争论)

我在内容 URI 上遇到了这个问题raw:,我发现的唯一解决方法是使用lastModified,当文件/文件夹不存在时返回 0

static public boolean fileExists(DocumentFile file) {
  return file.exists() && file.lastModified() > 0;
}

如果存在不提供日期信息的存储系统,lastModified 返回 0 的可能性仍然很小,但我不知道。

于 2021-01-16T23:08:40.907 回答