Comment attendre File.Exists?
J'ai une application, à l'écoute de l' *.fichier journal dans un dossier choisi. J'ai utilisé FileSystemWatcher
.
Mais il y a un problème. L'application d'autres responsables de la prise de ce fichier prend étapes suivantes:
- Faire un *.fichier gz
- Décompresser fichier txt (certains nom de fichier aléatoire)
- Modifier la *.txt nom propre avec un *.l'extension du journal.
Et je ne peux pas changer ce comportement.
J'ai donc fait 2 FileSystemWatcher
s *.gz, et *.les fichiers txt. Pourquoi? Parce que cette application n'a parfois pas de décompresser le fichier gz, et parfois ne pas renommer le fichier txt pour la finale *.le fichier de log.
FileSystemWatcher2
captures fichier txt, puis (dans la plupart des cas, il est renommé pour ouvrir une session dans le prochain 1000ms) j'ai besoin d'attendre un certain temps pour vérifier si un fichier txt existe (sinon, il semble être renommé pour la finale *.fichier journal).
La question est, comment faire pour vérifier si le fichier existe sans Thread.Sleep()
pour prévenir le gel de l'INTERFACE utilisateur?
J'espère que c'est clair, sinon je vais essayer de décrire au mieux. Je pense que c'est un problème complexe.
Quelques exemple de code:
Watcher pour gz fichier:
private void fileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
//this is for gz files in case if gz file is not unpacked automatically by other app
//I need to wait and check if gz was unpacked, if not, unpack it by myself,
//then txt watcher will catch that
Thread.Sleep(5000);
if (File.Exists(e.FullPath))
{
try
{
byte[] dataBuffer = new byte[4096];
using (System.IO.Stream fs = new FileStream(e.FullPath,
FileMode.Open,
FileAccess.Read))
{
using (GZipInputStream gzipStream = new GZipInputStream(fs))
{
string fnOut = Path.Combine(path_to_watcher,
Path.GetFileNameWithoutExtension(e.FullPath));
using (FileStream fsOut = File.Create(fnOut))
{
StreamUtils.Copy(gzipStream, fsOut, dataBuffer);
}
}
}
}
catch { //Ignore }
}
}
Watcher pour fichier txt:
private void fileSystemWatcher2_Created(object sender, FileSystemEventArgs e)
{
//this is for txt file
Thread.Sleep(3500);
if (File.Exists(e.FullPath))
{
//make my actions
}
else
{
//make my actions
}
}
source d'informationauteur user1750355
Vous devez vous connecter pour publier un commentaire.
Fait FileSystemWatcher événement Créé, appelé dans le thread séparé .NET lui-même.. Donc en gros que vous devez faire absolument rien. Votre code est bien comme il est.
En voici la preuve:
Vous pouvez utiliser un BackGroundWorker pour surveiller le système de fichiers, et d'éviter le gel de votre INTERFACE utilisateur
Vous pouvez utiliser le sommeil sans bloquer le thread de l'INTERFACE utilisateur, vous avez essentiellement de sommeil d'un sujet séparé.
Puis appeler cela comme:
Ou comme mentionné dans un autre post utiliser un
BackGroundWorker
à la place du sujet séparé, mettre le code que j'ai mentionné dansDoWork
et écouter pourOnFinish
événement mais comme il n'y a pas que beaucoup de travail de faire les deux méthodes sont très bien.