11
votes

Comment forcer la fichierSystemwatcher à attendre le téléchargement du fichier?

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 xxx < / Pré>

J'ai regardé SynchronizingObject et WaitForChangeDresult mais n'a pas reçu d'échantillon de travail solide.


5 commentaires

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/...


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.


4 Réponses :


2
votes

Une technique serait de télécharger sur le répertoire temporaire, puis déplacer it in c: / téléchargements une fois qu'il était complet.


3 commentaires

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!



2
votes

Si vous utilisez webclient à télécharger, vous pouvez utiliser Définir le fichier téléchargerfilecompléqué EventHandler.
Si vous le faites de cette façon, vous pouvez également utiliser client.downloadfileasync () pour le télécharger de manière asynchrone.


0 commentaires

16
votes

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;
}


3 commentaires

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?



5
votes

Si vous insistez sur l'utilisation de FileSystemWatcher 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éé et x modifié des événements avant que le fichier soit prêt à être utilisé.

Vous pouvez attraper les événements 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.


1 commentaires

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.