2011-05-05 5 views
0

J'ai eu un problème avec la lecture d'un fichier texte, ce n'est pas la lecture de moi-même qui pose problème lorsque je devrais le lire.Problème lors de la lecture du fichier texte

J'ai un programme serveur (fait par une société externe donc je n'ai aucun contrôle dessus) où vous pouvez mettre des fichiers. Le serveur voit un nouveau fichier est arrivé le lit et fait des choses avec, puis il met un résultat retour. J'attends donc que le fichier soit prêt, mais je ne peux pas le lire car je ne sais pas s'il existe déjà. Donc, je fais ceci:

while (IsFileLocked(file)) 
{ 
    Thread.Sleep(25); 
} 

private 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(); 
    } 

    //file is not locked 
    return false; 
} 

Maintenant, cela aide vraiment à vérifier si le fichier est lisible et je ne peux plus me IOExceptions plus quand je lis. Maintenant, je commence la lecture mais parfois je lis juste un fichier vide. Et je suis sûr que ça ne devrait pas être vide. Ce n'est pas un bug du programme serveur (j'expliquerai plus tard).

Voici le code où le problème commence:

using (StreamReader streamReader = file.OpenText()) 
{ 
    while (!streamReader.EndOfStream) 
    { 
     // here starts the reading 
    } 
} 

Mais quand j'utilise ce code je ne suis pas le problème:

using (StreamReader streamReader = file.OpenText()) 
{ 
    Thread.sleep(1000); 
    while (!streamReader.EndOfStream) 
    { 
     // here starts the reading 
    } 
} 

Donc, je suppose que le fichier est vide quand je peux l'ouvrir mais il n'y a pas de texte. J'ai changé le thread Thread.sleep à 100 milisecondes et puis je reçois le problème à nouveau. Quand je l'ai changé à 500 le problème a été résolu à nouveau.

Maintenant, mon logiciel doit fonctionner sur beaucoup d'ordinateurs différents, donc je ne sais pas à quelle vitesse ils sont, mais je crains que si j'ai réglé la minuterie au minimum, je pourrais avoir des problèmes sur d'autres ordinateurs. Mais je ne veux pas que mes utilisateurs attendent longtemps l'info. Attend la seule option ou existe-t-il un autre moyen? Y aura-t-il un problème sur d'autres ordinateurs avec une configuration matérielle différente?

Editer: J'ai essayé FileSystemWatcher, et ce n'est pas la solution!

+0

Vous pouvez utiliser le FileSystemWatcher pour vous informer lorsqu'un fichier est arrivé. De cette façon, vous savez que c'est là. Vous devrez toujours vérifier qu'il est lisible lorsque FileSystemWatcher vous avertit lorsque le fichier est créé, c'est-à-dire qu'il peut s'écouler plusieurs secondes avant qu'il ne soit lisible. J'ai implémenté une solution similaire pour le traitement des fichiers qui sont envoyés par FTP à un répertoire à différents moments de la journée. – tomasmcguinness

+0

@tomasmcguinness L'événement créé par le fichier est lancé par l'observateur lors de la création du fichier, mais il n'est peut-être pas encore lisible. Lorsque le fichier est complètement écrit et disponible, il lance un événement 'fichier modifié'. À ce stade, le fichier est disponible. –

+0

Ajout d'un FileSystemWatcher n'a pas résolu mon problème Je viens d'avoir le même problème à nouveau. Même avec le watcherchangetypes je continue à lire un fichier vide. Et quand j'utilise un Thread.sleep() cela fonctionne à nouveau parfaitement. Donc, il semble que filesystemwatcher n'est rien de plus qu'une implémentation .net de mon code. –

Répondre

0

L'outil dont vous avez besoin d'ajouter est un Filewatcher (voir MSDN System.IO.FileWatcher). Cela vous permettra de surveiller l'activité et d'ajouter des gestionnaires d'événements à la réponse aux événements de fichiers. Vous pouvez répondre au fichier créé en ajoutant un gestionnaire pour le fichier modifié.

Questions connexes