[Android Storage Access Framework文档以递归方式创建文件和目录

问题描述 投票:1回答:1

首先。

感谢您阅读此问题。

目前,我是Android新手(就像已经开始学习一个月了]

现在我需要在SD卡上“递归”写入文件和目录。

我的代码在下面的工作方式.....

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)

我是真的!

每个文件和目录都写在最上面!

我在这里想念东西吗?

如果这样做,请有智慧的人为我提供解决方案。

再次,感谢您阅读此问题

希望您有美好的一天

android android-sdcard storage-access-framework
1个回答
0
投票

看看这是否更好:

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()创建目录
  • 使用DocumentFilecreateDirectory()中解开getUri()
  • 尝试使用DocumentFile重新创建fromTreeUri()

继续使用DocumentFile直到您绝对需要Uri(在write()中,这是更安全,更有效的方法。

您对recursiveFolderDownload()的初始呼叫将使用我从原始样本中删除的DocumentFile.fromTreeUri(context, dst)呼叫。

© www.soinside.com 2019 - 2024. All rights reserved.