Je montage des fichiers qui sont supprimés sur un FTP via Watcher FileSystem, puis passez à un autre Dir. Maintenant, je déclenche la copie de la copie de l'événement Créer de l'observateur du système de fichiers, mais évidemment dans le cas de FTP, la création est simplement un fichier de stub et que les données sont entrées et remplissent le fichier en téléchargeant la fin. Quelqu'un a une solution élégante pour cela, ou dois-je faire ce que je pense avoir à faire
1 wait till last access time is about n ms in past before I copy 2 throw a control file in there to state that that file is done being copied, then delete control file 3 pound the crap out of it
6 Réponses :
Attendez que vous puissiez exclusivement ouvrir le fichier, je n'allais pas aussi loin pour dire que c'est une belle solution, mais probablement la stratégie la plus sûre dans les circonstances. P>
Je ne me souviens pas de la syntaxe de vérification si une ouverture exclusive? Qu'est-ce que c'est?
J'ai décidé de mordre la balle et de faire ma propre implémentation de fichiersSystemwatcher pour FTP, postera une fois terminé
Vous voulez la valeur de Aucun sur cette ENUM - MSDN.MicRosoft. com / fr-nous / bibliothèque / system.io.fileeshare.aspx
Sûrement .Lead est le plus approprié? Comme le cheeso explique dans cette réponse - "Fileeshare.read dit que les futurs ouvertures ne peuvent ouvrir le fichier uniquement avec accès en lecture" ": Stackoverflow.com/questions/897796/... a >
@Rohancragg. Chances que vous n'avez pas besoin de partager le fichier. Je sais que personne ne fonctionne, je ne sais pas que lire des travaux (je devrais le tester pour vérifier). Cette réponse fait également la même chose que ME- Stackoverflow.com/Questtions/278075/FileWatcher- Créé-événement
C'est une implémentation très naïve, mais elle convient à mes objectifs, j'ai vu suffisamment de personnes avec ce problème sur le Web, alors décidé de contribuer. La mise en œuvre est assez spécifique à mes besoins, je suis presque complètement indifférent à des événements modifiés compte tenu de la nature de mon problème, mais les gens peuvent organiser leur propre code s'ils doivent faire quelque chose de différent, c'est vraiment créé qui cause le plus de problèmes. Je n'ai pas complètement testé cela, mais d'abord, écrivez cela semble bon
Voici une implémentation pour rester en synchronisation
Demandez à la source de télécharger un fichier STUP directement après la fin du fichier de données et faites une surveillance de fichiersSystemwatcher pour le fichier STUP. Par exemple, si le nom du fichier de données est MyData_01234, le sceau woulb be myData_01234_stub. Le fichier de fichiersSystemwatcher doit alors avoir un masque de "* _stub". Vous connaissez ensuite le nom du fichier de données en supprimant le suffixe "_stub". Et le fichier de stages ne peut pas être téléchargé qu'après la fin du fichier de données, le fichier de données sera donc libre. P>
Si les fichiers de stub ne sont qu'un octet, vous devriez être capable de les supprimer après l'opération que vous effectuez avec le fichier de données sans problème. Si vos opérations sont particulièrement rapides, ajoutez un sommeil de 100 ms avant de supprimer le talon. P>
4 ans plus tard .... p>
Le fichier de stub est une bonne idée, mais probablement une manière légèrement plus robuste de le faire, c'est que votre source crée d'abord un fichier de stub, téléchargez votre fichier "réel", puis supprimez le talon. p>
Lorsque le fichier est copié à partir d'un autre serveur à l'aide de FTP, avant la copie du fichier complet, le nom de fichier est renommé avec une extension supplémentaire similaire à celle indiquée dans l'exemple de chemin ci-dessous.
c: \ interfaceerver \ ossledgas \ xmlfortest \ teststbfile.xml .TMP P>
Pour surmonter cette situation, suivez deux étapes p>
Vous devez simplement appeler la méthode ci-dessous pour supprimer l'extension supplémentaire. et ajoutez attendre 2 secondes dans le code de sorte que le fichier complet est créé et vous pouvez l'utiliser pour un traitement ultérieur. P>
public static string VerifyIfStubFile(string filePath, string extension) { if (filePath.Length - (filePath.IndexOf(extension) + extension.Length) != 0) { /*LogMsg("Info : VerifyIfStubFile : Stub file found. Lets fix it!!"); */ return filePath = filePath.Substring(0, (filePath.IndexOf(extension) + extension.Length)); } return filePath; }