Android Storage Access Framework Document Создание файла и директории рекурсивно - PullRequest
1 голос
/ 12 апреля 2020

Прежде всего.

Спасибо за чтение этого вопроса.

В настоящее время я новичок в Android (Как будто я уже начал изучать месяц)

А теперь мне нужно записать файлы и каталоги "RECURSIVELY" на 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)

Я имею в виду!

Все файлы и каталоги просто написаны сверху!

Я что-то здесь упускаю?

Если я это сделаю, пожалуйста, мудрый человек, направьте меня решение.

И еще раз, спасибо, что прочитали этот вопрос

надеюсь, у вас хороший день

1 Ответ

0 голосов
/ 12 апреля 2020

Посмотрите, работает ли это лучше:

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()
  • Разверните DocumentFile из createDirectory() с использованием getUri()
  • Попробуйте воссоздать DocumentFile с использованием fromTreeUri()

Безопаснее и эффективнее просто продолжать использовать DocumentFile до тех пор, пока вам абсолютно не понадобится Uriwrite()).

При первом вызове recursiveFolderDownload() будет использоваться вызов DocumentFile.fromTreeUri(context, dst), который я удалил из вашего исходного образца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...