Java: проверьте, был ли файл полностью скопирован с использованием SFTP
У меня есть опросник, работающий в определенном каталоге каждые 35 с. Файлы размещаются в этом каталоге через SFTP-сервер. Проблема в том, что всякий раз, когда опрос конфликтует со временем, когда файл копируется. Он также выбирает неполный файл, который еще не полностью скопирован.
Можем ли мы узнать состояние файла, находится ли он в режиме копирования или в режиме копирования?
2 ответа
Существует несколько распространенных стратегий для наблюдателей файлов, чтобы "знать", что файл полностью передан
Опрос с интервалом времени и обработка файла для полной передачи, если размер файла не изменяется в течение интервала. например, следить за существованием файла каждую 1 минуту. Как только вы увидите, что файл существует, следите за его размером каждые 5 секунд. Если размер файла остается постоянным в течение 30 секунд, считайте его полностью переданным.
Пусть процесс передачи создаст файл тегов после передачи файла. например, после завершения передачи файла
FOO.txt
, создай пустойFOO.txt.tag
, Ваш файл наблюдатель собирается проверить наличиеFOO.txt.tag
и как только он существует, вы знаете,FOO.txt
был полностью переданВ некоторых особых случаях, когда файл имеет специальный формат (например, специальную строку нижнего колонтитула), средство просмотра файлов может опросить файл и просмотреть последние строки и посмотреть, соответствуют ли они требуемому шаблону.
У каждого метода есть свои плюсы и минусы:
- Способ 1 меньше всего влияет на процесс передачи. Иногда файлы передаются третьей стороной, и вы почти не можете сказать им, чтобы они создавали файл тегов, как в методе 2. Однако вы можете сказать, что этот метод не на 100% надежен, особенно в плохой сети.
- Метод 2 является наиболее надежным. Однако, как уже было сказано, есть случаи, когда вы не можете контролировать процесс передачи
- Метод 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);
}