我的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。 为什么它不起作用? 什么是正确的代码?
如果要查找文件夹是否存在,请声明Uri
和DocumentFile
,然后在DocumentFile
上使用findFile()
以查看它是否null
(即不存在(。如果为null
,请创建文件夹。下面是一个示例:
Uri treeUri = muri;
DocumentFile root = DocumentFile.fromTreeUri(this, treeUri);
if (root.findFile("Foldername") == null) { //create folder }
尝试使用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();
}
(我忽略了关于"/subfoldername"是否有效或应该是"%2Fsubfoldername"的争论(
我在raw:
内容 URI 上遇到了这个问题,我发现的唯一解决方法是使用lastModified
,当文件/文件夹不存在时返回 0
static public boolean fileExists(DocumentFile file) {
return file.exists() && file.lastModified() > 0;
}
如果有一个存储系统不提供日期信息,但我不知道任何日期信息,则 lastModified 返回 0 的可能性可能仍然很小。