android - 如何从可移动 sd 卡路径中获取所有文件路径和名称?
问题描述
到目前为止,试图从可移动 sdcard 中获取所有文件路径和名称,我得到了 sdcard 的路径,例如“/storage/BBF8-A8D3”。现在代表这条路径,我想更深入地查找文件,如果有子目录,请转到它们并在这些子目录中查找文件。
这给了我 sdcard 的路径
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static List<String> getSdCardPaths(final Context context, final boolean includePrimaryExternalStorage) {
final File[] externalCacheDirs = ContextCompat.getExternalCacheDirs(context);
if (externalCacheDirs == null || externalCacheDirs.length == 0)
return null;
if (externalCacheDirs.length == 1) {
if (externalCacheDirs[0] == null)
return null;
final String storageState = EnvironmentCompat.getStorageState(externalCacheDirs[0]);
if (!Environment.MEDIA_MOUNTED.equals(storageState))
return null;
if (!includePrimaryExternalStorage && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && Environment.isExternalStorageEmulated())
return null;
}
final List<String> result = new ArrayList<>();
if (includePrimaryExternalStorage || externalCacheDirs.length == 1)
result.add(getRootOfInnerSdCardFolder(externalCacheDirs[0]));
for (int i = 1; i < externalCacheDirs.length; ++i) {
final File file = externalCacheDirs[i];
if (file == null)
continue;
final String storageState = EnvironmentCompat.getStorageState(file);
if (Environment.MEDIA_MOUNTED.equals(storageState))
result.add(getRootOfInnerSdCardFolder(externalCacheDirs[i]));
}
if (result.isEmpty())
return null;
return result;
}
/**
* Given any file/folder inside an sd card, this will return the path of the sd card
*/
private static String getRootOfInnerSdCardFolder(File file) {
if (file == null)
return null;
final long totalSpace = file.getTotalSpace();
while (true) {
final File parentFile = file.getParentFile();
if (parentFile == null || parentFile.getTotalSpace() != totalSpace)
return file.getAbsolutePath();
file = parentFile;
}
}
然后用于递归查找文件但卡住
public void recursiveFunction(File dirPath) {
File f = new File(String.valueOf(dirPath));
filesarray = f.listFiles();
try {
for (int i = 0; i < filesarray.length; i++) {
if (filesarray[i].isFile()) {
int mid = filesarray[i].getName().lastIndexOf(".");
// String ext=filesarray[i].getName().substring(mid+1,filesarray[i].getName().length());
FilesNamez.add(filesarray[i].getName());
FilesPathz.add(filesarray[i].getAbsolutePath());
} else
recursiveFunction(filesarray[i].getAbsoluteFile());
}
}
catch (Exception ex){}
}
解决方案
推荐阅读
- reactjs - Jest/Enzyme - 如何将 nock 库与连接的 redux 存储组件一起使用?
- powerbi - 使用单个用户嵌入 Power BI 报表服务器报表
- python - 确定数组中是否有两个相邻的 2
- api - Instagram API:回复某人的帖子?
- php - 在数组中查找下一个并预览元素
- android - RecyclerView onItemClick 不工作,总是显示空指针异常
- javascript - Outlook Web 插件中发送和草稿按钮之间的插入按钮
- c++ - 我可以使用模板函数作为另一个模板的参数吗?
- javascript - 我可以用等效的 fetch() 调用替换 jQuery.load() 单行吗?
- amazon-web-services - 无法从另一个本地运行的应用程序调用本地运行的 lambda