Как определить, что файл загружается по FTP
мое приложение следит за набором папок, в которые пользователи могут загружать файлы. Когда загрузка файла завершена, я должен применить лечение, но я не знаю, как определить, что файл не закончил загрузку.
любой способ определить, если файл еще не выпущен FTP-сервером?
4 ответов
нет общего решения этой проблемы.
некоторые FTP-серверы блокируют загружаемый файл, не позволяя вам получить к нему доступ, пока файл все еще загружается. Например, это делает сервер IIS FTP. Большинство других FTP-серверов этого не делают. См. мой ответ на запретить доступ к файлу при его загрузке.
есть некоторые общие обходные пути к проблеме (первоначально опубликовано в SFTP механизм блокировки файлов, но соответствующими для FTP тоже):
- вы можете отправить клиенту файл "готово" после завершения загрузки. Заставьте свою автоматизированную систему ждать появления файла "готово".
- у вас может быть выделенная папка "upload" и клиент (атомарно) переместит загруженный файл в папку "done". Сделайте свою автоматизированную систему только в папке "готово".
- есть правила именования файлов, загруженные (".filepart") и переименовать клиент (атомарно) файл после загрузки на его окончательное имя. Заставьте вашу автоматизированную систему игнорировать".filepart по" файлов.
См. (мою) статью блокировка файлов При загрузке / загрузке во временное имя файла для примера реализации этого подхода. - грубый Хак должен периодически проверять атрибуты файла (размер и время) и считать загрузку законченной, если атрибуты не изменились в течение некоторого интервала времени.
некоторые FTP-серверы позволяют настройте крюк для вызова, когда загрузка завершена. Вы можете использовать это. Например, ProFTPD имеет модуль mod_exec (см.
Я использую ftputil для реализации этой работы:
- подключение к ftp-серверу
- список всех файлов каталога
- вызовите stat () для каждого файла
- подождите N секунд
- для каждого файла: вызовите stat() снова. Если результат отличается, то пропустите этот файл, так как он был изменен в течение последних секунд.
- если результат stat () не отличается, загрузите файл.
вся эта ftp-fetching-это старая и устаревшая технология. Надеюсь, что в следующий раз клиент будет использовать современный HTTP API: -)
Если Вы читаете файлы определенных расширений, то используйте помощью WinSCP для передачи файлов. Он создаст временный файл с расширением .filepart по и он превратится в фактическое расширение файла, как только он полностью передаст файл.
надеюсь, это кому-то поможет.
Это классическая проблема с передачей FTP. Единственное в основном надежный метод, который я нашел, - это отправить файл, а затем отправить второй короткий файл "маркера", чтобы сообщить получателю, что передача первого завершена. Вы можете использовать соглашение об именовании файлов и просто проверить наличие второго файла.
вы можете получить фантазии и сделать содержимое второго файла контрольной суммой первого файла. Затем вы можете проверить первый файл. (У тебя нет проблем. со вторым файлом, потому что вы просто ждете, пока размер файла = размер контрольной суммы).
и, конечно, это работает только в том случае, если вы можете заставить отправителя отправить второй файл.