Android 存储访问框架文档递归创建文件和目录
Android Storage Access Framework Document Create File & Dir Recursively
首先。
感谢您阅读这个问题。
目前我是Android新手(好像学了一个月了)
现在我需要在 SD 卡上写入文件和目录 "RECURSIVELY"。
我下面的代码有点工作......
private void recursiveFolderDownload(String src, Uri dst) throws SftpException {
Log.e("dst",dst.toString());
DocumentFile pickedDir = DocumentFile.fromTreeUri(context, dst);
Vector<ChannelSftp.LsEntry> fileAndFolderList = channelSftp.ls(src);
for (ChannelSftp.LsEntry item : fileAndFolderList) {
if (!item.getAttrs().isDir()) {
DocumentFile newFile = pickedDir.createFile("",item.getFilename());
write(src + "/" + item.getFilename(),newFile.getUri());
} else if (!(".".equals(item.getFilename()) || "..".equals(item.getFilename()))) {
DocumentFile newDir = pickedDir.createDirectory(item.getFilename());
recursiveFolderDownload(src + "/" + item.getFilename(), newDir.getUri());
}
}
}
老实说,我写的每一个文件和目录都只写在同一个路径上
哪个是最上面的(content://com.android.externalstorage.documents/tree/E3AB-1A0D%3A)
我是认真的!
所有文件和目录都写在最上面!
我是不是漏掉了什么?
如果是,请高手指点一下解决方法
再次感谢您阅读这个问题
希望你今天过得愉快
看看这个效果是否更好:
private void recursiveFolderDownload(String src, DocumentFile pickedDir) throws SftpException {
Log.e("dst",dst.toString());
Vector<ChannelSftp.LsEntry> fileAndFolderList = channelSftp.ls(src);
for (ChannelSftp.LsEntry item : fileAndFolderList) {
if (!item.getAttrs().isDir()) {
DocumentFile newFile = pickedDir.createFile("",item.getFilename());
write(src + "/" + item.getFilename(),newFile.getUri());
} else if (!(".".equals(item.getFilename()) || "..".equals(item.getFilename()))) {
DocumentFile newDir = pickedDir.createDirectory(item.getFilename());
recursiveFolderDownload(src + "/" + item.getFilename(), newDir);
}
}
}
在您现有的代码中,您:
- 使用
createDirectory()
创建目录
- 使用
getUri()
从 createDirectory()
展开 DocumentFile
- 尝试使用
fromTreeUri()
重新创建 DocumentFile
继续使用 DocumentFile
更安全、更高效,直到您绝对需要 Uri
(在 write()
中)。
您对 recursiveFolderDownload()
的初始调用将使用我从您的原始示例中删除的 DocumentFile.fromTreeUri(context, dst)
调用。
首先。
感谢您阅读这个问题。
目前我是Android新手(好像学了一个月了)
现在我需要在 SD 卡上写入文件和目录 "RECURSIVELY"。
我下面的代码有点工作......
private void recursiveFolderDownload(String src, Uri dst) throws SftpException {
Log.e("dst",dst.toString());
DocumentFile pickedDir = DocumentFile.fromTreeUri(context, dst);
Vector<ChannelSftp.LsEntry> fileAndFolderList = channelSftp.ls(src);
for (ChannelSftp.LsEntry item : fileAndFolderList) {
if (!item.getAttrs().isDir()) {
DocumentFile newFile = pickedDir.createFile("",item.getFilename());
write(src + "/" + item.getFilename(),newFile.getUri());
} else if (!(".".equals(item.getFilename()) || "..".equals(item.getFilename()))) {
DocumentFile newDir = pickedDir.createDirectory(item.getFilename());
recursiveFolderDownload(src + "/" + item.getFilename(), newDir.getUri());
}
}
}
老实说,我写的每一个文件和目录都只写在同一个路径上
哪个是最上面的(content://com.android.externalstorage.documents/tree/E3AB-1A0D%3A)
我是认真的!
所有文件和目录都写在最上面!
我是不是漏掉了什么?
如果是,请高手指点一下解决方法
再次感谢您阅读这个问题
希望你今天过得愉快
看看这个效果是否更好:
private void recursiveFolderDownload(String src, DocumentFile pickedDir) throws SftpException {
Log.e("dst",dst.toString());
Vector<ChannelSftp.LsEntry> fileAndFolderList = channelSftp.ls(src);
for (ChannelSftp.LsEntry item : fileAndFolderList) {
if (!item.getAttrs().isDir()) {
DocumentFile newFile = pickedDir.createFile("",item.getFilename());
write(src + "/" + item.getFilename(),newFile.getUri());
} else if (!(".".equals(item.getFilename()) || "..".equals(item.getFilename()))) {
DocumentFile newDir = pickedDir.createDirectory(item.getFilename());
recursiveFolderDownload(src + "/" + item.getFilename(), newDir);
}
}
}
在您现有的代码中,您:
- 使用
createDirectory()
创建目录
- 使用
getUri()
从 - 尝试使用
fromTreeUri()
重新创建
createDirectory()
展开 DocumentFile
DocumentFile
继续使用 DocumentFile
更安全、更高效,直到您绝对需要 Uri
(在 write()
中)。
您对 recursiveFolderDownload()
的初始调用将使用我从您的原始示例中删除的 DocumentFile.fromTreeUri(context, dst)
调用。