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) 调用。