Kotlin File.copyTo генерирует исключение FileAlreadyExistsException с перезаписью, установленной в true - PullRequest
0 голосов
/ 17 июня 2019

Я занимаюсь разработкой приложения, которое предъявляет некоторые особые требования, одно из которых состоит в том, чтобы регистрировать каждое отдельное действие, выполняемое в приложении:

  1. Действие, выполненное пользователем
  2. Записать действие с Timber
  3. Добавить эту строку к файлу журнала во внешнем хранилище устройства (устройстве хранения данных)
  4. Обновить копию этого файла на съемном внешнем хранилище (SD-карта)

Всякий раз, когда выполняется действие, я использую Timber.i("log message"), и я переопределяю метод log(Int, String, String, Throwable) там, где я делаю другие вещи:

override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
    if (priority == Log.INFO) {
        appendToLog(message);
    }
}

и appendToLog(String):

private fun appendToLog(message: String) {
    // skipping the unnecessary code which transforms some info in a string, this works fine
    val log = LogData(...)

    // pathManager.getLogFile() returns a File and works
    val fw = FileWriter(pathManager.getLogFile(),true)
    // log.checksum() and log.encrypt() return a String, this works fine
    val checksum = log.checksum()
    val encrypted = log.encrypt()
    fw.write(encrypted.plus("--!").plus(checksum))
    fw.close()


    // copying log file to sd
    pathManager.getLogFile()
        .copyTo(pathManager.getSdLogFile(), true) // the exception is thrown here

}

Выдается следующее исключение, другие юридические причины не могут быть добавлены другие детали, это все основные сведения об исключении

kotlin.io.FileAlreadyExistsException:
my/file/path -> my/file/path: The destination file already exists

Я прочитал здесь , что это исключение выбрасывается , только если целевой файл уже существует и если перезаписано false, но я установил его как true.

Кто-нибудь испытывал это? Как мне заставить его работать?

# Примечание: Я знаю, что это может не соответствовать стандартам / рекомендациям Android, это не обычное приложение, а продукт, разработанный и разработанный для удовлетворения требований заказчика.

1 Ответ

1 голос
/ 17 июня 2019

Ссылаясь на точный код, который вы указали:

val stillExists = if (!overwrite) true else !target.delete()

Это исключение все равно будет выдано, когда overwrite истинно и File#delete возвращает ложьуказывает на то, что не удалось удалить целевой файл.Это может иметь несколько причин, но это наиболее распространенные:

  1. целевой файл является каталогом, и он по-прежнему содержит файлы.
  2. файл открыли в другом процессе, удерживая егоблокировка и предотвращение мутаций.

Javadoc File#delete относится к методу Files#delete, если вы хотите получить лучшую информацию о причине сбоя удаления, вызов его вручную перед вызовом File.copyTo позволитопределить причину сбоя.

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