@Dmtm
Android

Почему ftpClient.changeWorkingDirectory иногда не срабатывает хотя ошибок нет?

используется библиотека от апача
implementation  group: 'commons-net', name: 'commons-net', version: '3.6'
    implementation  group: 'commons-io', name: 'commons-io', version: '2.6'

при быстрых переходах по папкам иногда dir==null, причем при повторном заходе чаще всего срабатывает правильно, пока добавил цикл но это конечно не решение
т.е. ни Exception ни isPositiveCompletion не срабатывают
и список файлов тоже иногда получается пустой (после правильной смены папки)
suspend fun changeDir(ftpClient: FTPClient, targetDir: String): String {
            var i = 0
            var dir: String? = null
            do {
                if (!ftpClient.changeWorkingDirectory(targetDir) || !FTPReply.isPositiveCompletion(ftpClient.replyCode)) {
                    throw Exception(ftpClient.replyString)
                }
                dir = ftpClient.printWorkingDirectory()
                Log.d(TAG, "changeDir completed, current: " + dir)
            } while (i++ < 3 && dir == null)

            return targetDir
        }

        /**
         * @param ftpClient ftpClient in connected state
         * */
        suspend fun fileList(ftpClient: FTPClient): List<FTPFile> {
            val fileList = ftpClient.listFiles()//App.instance.ftpFolderNavigator.buildPath()
            Log.d(TAG, "fileList from: " + ftpClient.printWorkingDirectory())
            return if (FTPReply.isPositiveCompletion(ftpClient.replyCode)) {
                Log.d(TAG, "size: " + fileList.size)
                fileList.asList()
            } else {
                throw Exception("Server file list taken error, code: " + ftpClient.replyCode)
            }
        }

соединение открывается так:
suspend fun connect(server: String, port: Int, login: String, pass: String): FTPClient {
            val ftpClient = FTPClient()
            ftpClient.autodetectUTF8 = true
            ftpClient.controlEncoding = "UTF-8";
            ftpClient.enterLocalPassiveMode()
            ftpClient.connect(server, port)
            if (!ftpClient.login(login, pass)) {
                throw Exception("Login error")
            }

            if (FTPReply.isPositiveCompletion(ftpClient.replyCode)) {
                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            } else {
                throw Exception("Server connection error, code: " + ftpClient.replyCode)
            }
            return ftpClient
        }
  • Вопрос задан
  • 56 просмотров
Решения вопроса 1
@Dmtm Автор вопроса
Android
переписал на ftp4j, работает
PS: и это уже не первый раз проблемы с библиотеками от апача
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы