我的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进行验证。 为什么不起作用? 什么是正确的代码?
答案 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 的可能性仍然很小,但我不知道。