Java: проверьте, был ли файл полностью скопирован с использованием SFTP

У меня есть опросник, работающий в определенном каталоге каждые 35 с. Файлы размещаются в этом каталоге через SFTP-сервер. Проблема в том, что всякий раз, когда опрос конфликтует со временем, когда файл копируется. Он также выбирает неполный файл, который еще не полностью скопирован.

Можем ли мы узнать состояние файла, находится ли он в режиме копирования или в режиме копирования?

2 ответа

Существует несколько распространенных стратегий для наблюдателей файлов, чтобы "знать", что файл полностью передан

  1. Опрос с интервалом времени и обработка файла для полной передачи, если размер файла не изменяется в течение интервала. например, следить за существованием файла каждую 1 минуту. Как только вы увидите, что файл существует, следите за его размером каждые 5 секунд. Если размер файла остается постоянным в течение 30 секунд, считайте его полностью переданным.

  2. Пусть процесс передачи создаст файл тегов после передачи файла. например, после завершения передачи файла FOO.txt, создай пустой FOO.txt.tag, Ваш файл наблюдатель собирается проверить наличие FOO.txt.tag и как только он существует, вы знаете, FOO.txt был полностью передан

  3. В некоторых особых случаях, когда файл имеет специальный формат (например, специальную строку нижнего колонтитула), средство просмотра файлов может опросить файл и просмотреть последние строки и посмотреть, соответствуют ли они требуемому шаблону.

У каждого метода есть свои плюсы и минусы:

  1. Способ 1 меньше всего влияет на процесс передачи. Иногда файлы передаются третьей стороной, и вы почти не можете сказать им, чтобы они создавали файл тегов, как в методе 2. Однако вы можете сказать, что этот метод не на 100% надежен, особенно в плохой сети.
  2. Метод 2 является наиболее надежным. Однако, как уже было сказано, есть случаи, когда вы не можете контролировать процесс передачи
  3. Метод 3 применим только в особых случаях

Выберите тот, который соответствует вашим потребностям

Имейте размеры файла примечания Poller. Если размер не изменился от одного раунда к следующему, загрузка файла завершена.

Можете ли вы повлиять на сервер SFTP? Может ли он создать файл маркера после завершения загрузки (например,.thisIsAFile.doc.done")?

Используйте это для Unix, если вы передаете файлы с помощью winscp или FTP:

public static void isFileReady(File entry) throws Exception {
        long realFileSize = entry.length();
        long currentFileSize = 0;
        do {
            try (FileInputStream fis = new FileInputStream(entry);) {
                currentFileSize = 0;
                while (fis.available() > 0) {
                    byte[] b = new byte[1024];
                    int nResult = fis.read(b);
                    currentFileSize += nResult;
                    if (nResult == -1)
                        break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("currentFileSize=" + currentFileSize + ", realFileSize=" + realFileSize);
        } while (currentFileSize != realFileSize);
    }
Другие вопросы по тегам