SAF-方法检查文件夹Uri是否存在,始终为真

时间:2019-10-01 08:56:49

标签: android uri subdirectory storage-access-framework documentfile

我的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进行验证。 为什么不起作用? 什么是正确的代码?

3 个答案:

答案 0 :(得分:0)

尝试使用fromSingleUri代替fromTreeUri。也许还值得检查提取的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();
}

答案 1 :(得分:0)

您已经获得了用于检查通过ACTION_OPEN_DOCUMENT_TREE获得的树中是否存在文件夹的代码:

SAF - Attempting to create again an existing folder/file yields a new folder/file

怎么了?

如果您想为其提供其他实现,请继续。

进一步:没有人知道您用来调用appendUriString()的参数值,因此很难看到发生了什么或出错了。也不调用其他函数。请发布可复制的代码。

答案 2 :(得分:0)

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

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

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

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