Как определить, что файл загружается по FTP

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

любой способ определить, если файл еще не выпущен FTP-сервером?

4 ответов


нет общего решения этой проблемы.

некоторые FTP-серверы блокируют загружаемый файл, не позволяя вам получить к нему доступ, пока файл все еще загружается. Например, это делает сервер IIS FTP. Большинство других FTP-серверов этого не делают. См. мой ответ на запретить доступ к файлу при его загрузке.

есть некоторые общие обходные пути к проблеме (первоначально опубликовано в SFTP механизм блокировки файлов, но соответствующими для FTP тоже):

  • вы можете отправить клиенту файл "готово" после завершения загрузки. Заставьте свою автоматизированную систему ждать появления файла "готово".
  • у вас может быть выделенная папка "upload" и клиент (атомарно) переместит загруженный файл в папку "done". Сделайте свою автоматизированную систему только в папке "готово".
  • есть правила именования файлов, загруженные (".filepart") и переименовать клиент (атомарно) файл после загрузки на его окончательное имя. Заставьте вашу автоматизированную систему игнорировать".filepart по" файлов.
    См. (мою) статью блокировка файлов При загрузке / загрузке во временное имя файла для примера реализации этого подхода.
  • грубый Хак должен периодически проверять атрибуты файла (размер и время) и считать загрузку законченной, если атрибуты не изменились в течение некоторого интервала времени.

некоторые FTP-серверы позволяют настройте крюк для вызова, когда загрузка завершена. Вы можете использовать это. Например, ProFTPD имеет модуль mod_exec (см.


Я использую ftputil для реализации этой работы:

  1. подключение к ftp-серверу
  2. список всех файлов каталога
  3. вызовите stat () для каждого файла
  4. подождите N секунд
  5. для каждого файла: вызовите stat() снова. Если результат отличается, то пропустите этот файл, так как он был изменен в течение последних секунд.
  6. если результат stat () не отличается, загрузите файл.

вся эта ftp-fetching-это старая и устаревшая технология. Надеюсь, что в следующий раз клиент будет использовать современный HTTP API: -)


Если Вы читаете файлы определенных расширений, то используйте помощью WinSCP для передачи файлов. Он создаст временный файл с расширением .filepart по и он превратится в фактическое расширение файла, как только он полностью передаст файл.

надеюсь, это кому-то поможет.


Это классическая проблема с передачей FTP. Единственное в основном надежный метод, который я нашел, - это отправить файл, а затем отправить второй короткий файл "маркера", чтобы сообщить получателю, что передача первого завершена. Вы можете использовать соглашение об именовании файлов и просто проверить наличие второго файла.

вы можете получить фантазии и сделать содержимое второго файла контрольной суммой первого файла. Затем вы можете проверить первый файл. (У тебя нет проблем. со вторым файлом, потому что вы просто ждете, пока размер файла = размер контрольной суммы).

и, конечно, это работает только в том случае, если вы можете заставить отправителя отправить второй файл.