Le fichier du serveur FTP est verrouillé pendant le téléchargement

1

Une application interroge régulièrement un répertoire des fichiers csv d'entrée qui arrivent par FTP. Un serveur FTP (actuellement, Filezilla Server) est exécuté sur cet ordinateur.

Le problème est que si un fichier est en cours de téléchargement lorsque l'application décide de sonder l'emplacement, le fichier est verrouillé et toutes sortes d'erreurs inesthétiques sont générées sur l'application, ce qui nuit à l'expérience utilisateur.

Maintenant, en supposant que je ne puisse pas modifier l'application pour attendre, y a-t-il quelque chose à faire à ce sujet? Par exemple, le serveur déplace ou renomme automatiquement le fichier une fois le téléchargement terminé? Ou attendez-vous que le téléchargement soit terminé avant de sauvegarder le fichier? Ou existe-t-il d'autres serveurs offrant des solutions telles que celle-ci?

Colmde
la source
2
"déplacer ou renommer automatiquement le fichier une fois le téléchargement terminé" - Normalement, le client doit envoyer les commandes appropriées et le serveur les comprendre. FTP en tant que protocole prend en charge la suppression, le changement de nom ; voir DELE, RNFR, RNTO. Mais cela provient du côté client; vous cherchez une solution qui fonctionne sur le serveur. C'est pourquoi mon commentaire n'est pas une réponse. Cela sent le problème XY . C'est bien que vous ayez décrit une image plus large. Peut-être envisagerez-vous cette approche côté client.
Kamil Maciorowski
J'ai déjà vu cela auparavant avec des fichiers volumineux qui constituent de nombreux concerts où quelque chose sur le serveur touche ou déplace un fichier partiellement téléchargé avant la fin du téléchargement. Des erreurs telles que " Impossible de créer un fichier distant " et " Echec de la copie des fichiers sur le côté distant ". Je sais que les limites / quotas de stockage peuvent aussi en être la cause, mais j’ai vu cela se produire lorsque quelque chose côté serveur perturbe le fichier partiellement téléchargé.
Pimp Juice IT
Envisagez de télécharger sur le serveur via la connexion WAN, etc. plus lente, sinon filename.tmple processus ne se touchera pas, puis une fois le téléchargement terminé, exécutez une commande rename / mv pour renommer le fichier téléchargé à 100% en son nom complet. . En outre, envisagez de télécharger vers un sous-dossier / tmp puis, une fois que vous avez été chargé, accédez au répertoire de téléchargement racine ou à un autre emplacement. Le téléchargement sur le réseau étendu lent prend généralement le plus de temps. Par conséquent, la commande de changement de nom ou de déplacement locale sera beaucoup plus rapide et empêchera ce problème.
Pimp Juice IT
@ KamilMaciorowski - J'ai bien pensé à le faire, mais le changement de nom sera-t-il instantané, en ce sens que le fichier sera déverrouillé dès que le changement de nom sera terminé? Je demande parce que parfois le téléchargement prend plusieurs secondes entre la création et la publication du fichier, même s'il s'agit d'un très petit fichier, par exemple 30-40 octets. J'ai également modifié la question pour que votre commentaire soit davantage une réponse.
Colmde
Je ne sais pas, j'utilise rarement le FTP. Si j'étais vous, je le testerais.
Kamil Maciorowski

Réponses:

0

Je recommanderais l'approche où votre application n'interroge pas l'emplacement utilisé par un autre processus (serveur FTP dans ce cas) pour écrire. Au lieu de cela, définissez le processus sur rnfr / rnto (opération atomique) des fichiers après leur arrivée aux emplacements interrogés par votre application ... Vous devez essayer de prendre readlock sur le fichier et, en cas d'échec, ignorez-le jusqu'à la prochaine tentative. Une autre approche consiste à utiliser un fichier marqueur qui arrivera en dernier dans le lot de fichiers et signale à votre application d'interrogation qu'il peut commencer à traiter les fichiers CSV.

Mikhail Melamud
la source