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



我的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;
}

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

请注意,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。

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

如果要查找文件夹是否存在,请声明UriDocumentFile,然后在DocumentFile上使用findFile()以查看它是否null(即不存在(。如果为null,请创建文件夹。下面是一个示例:

Uri treeUri = muri;
DocumentFile root = DocumentFile.fromTreeUri(this, treeUri);
if (root.findFile("Foldername") == null) { //create folder }

尝试使用fromSingleUri而不是fromTreeUri。可能还值得检查获取的DocumentFileisDirectory是否确实如此。

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();
}

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

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

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

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

相关内容

最新更新