Je télécharge un fichier et je veux exécuter l'installation uniquement après la fin du téléchargement. Comment puis-je accomplir cela? On dirait que les fichiersSystemwatcher OnCreate Event le feraient, mais cela se produit dans un fil différent, existe-t-il un moyen simple de forcer la partie d'attente à se produire dans le même thread.
code que j'ai jusqu'ici p> J'ai regardé SynchronizingObject et WaitForChangeDresult mais n'a pas reçu d'échantillon de travail solide. p> p>
4 Réponses :
Une technique serait de télécharger sur le répertoire temporaire, puis déplacer em> it in c: / téléchargements une fois qu'il était complet. p>
Comment saurais-je savoir si le téléchargement est complet, c'est-à-dire quand déclencher le mouvement?
Dépend de la façon dont vous le téléchargez. À quoi ressemble le code?
Faire x quand le téléchargement est terminé. Eh bien c'est la question!
Si vous utilisez webclient code> à télécharger, vous pouvez utiliser Définir le fichier
téléchargerfilecompléqué code> EventHandler.
Si vous le faites de cette façon, vous pouvez également utiliser client.downloadfileasync () code> pour le télécharger de manière asynchrone. P>
Essayez:
FileInfo fInfo = new FileInfo(e.FullPath); while(IsFileLocked(fInfo)){ Thread.Sleep(500); } InstallMSI(e.FullPath); static bool IsFileLocked(FileInfo file) { FileStream stream = null; try { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (IOException) { return true; } finally { if (stream != null) stream.Close(); } return false; }
C'est la solution la plus directe, mais je ne veux pas utiliser plus de threads.sleeps dans mon code. Donc j'utilise l'autre approche
J'écris une application de console et cela a fonctionné parfaitement. Comme je n'ai qu'un seul fil, j'utilise cela. +1.
Peut-être ajouter un chèque pour si le fichier existe?
Si vous insistez sur l'utilisation de Vous pouvez attraper les événements code> créés et créer de nouveaux threads (dédiés) (sauf si vous avez déjà un thread en cours pour ce fichier) dans lequel vous bouclez et essayez périodiquement d'ouvrir le fichier exclusivement. Si vous réussissez, le fichier est prêt. P> FileSystemWatcher CODE> Vous devez probablement expliquer le fait qu'un fichier de taille unique n'est pas créé (téléchargé) en une seule opération. Le système de fichiers est susceptible de produire 1
créé code> et x
modifié des événements code> avant que le fichier soit prêt à être utilisé. P>
C'est absolument vrai. J'utilise cela pour un programme de transfert SFTP simple, et même un fichier 17K copié de la racine à Tester répertoire produit 1 créé et 4 événements modifiés.
Comment téléchargez-vous le fichier? Un exemple de code est agréable.
Le téléchargement est en cours de réalisation dans UI .. Ce code rendra cette question en désordre. Je ne peux que dire que lorsque ce code est déclenché, l'action de téléchargement a déjà commencé.
Dupliqué possible de Le travail FileSystemWatcher est effectué?
Vérifiez également Stackoverflow.com/questions/3822175/.../ a>
Système de fichiers Moniteurs Moniteurs de modifications dans le répertoire ou les fichiers dans le répertoire, il n'est pas surveiller lorsque vous terminez les modifications dans un fichier. Votre code de téléchargement doit gérer lors du téléchargement des finitions.