C#: l'Utilisation de StreamReader pour lire ligne à partir d'un fichier txt, mais Peek() renvoie -1, même il ya beaucoup de lignes à gauche
Je utiliser Peek() la méthode de StreamReader pour vérifier si il y a plus de lignes à traiter. Il y a plus de 1000 lignes dans mon fichier, mais Peek() soudainement de retour -1 quand il atteint la ligne#750. J'ai vérifié mais la semble pas de différences entre la ligne#750 et n ° 751. Même que j'ai supprimé la ligne#750 et 751, il sera toujours en pause jusqu'à l'autre ligne.
Ci-dessous sont mes codes pour votre information:
try
{
String ftpserver = ftp + filename;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpserver));
reqFTP.UsePassive = false;
reqFTP.UseBinary = true;
reqFTP.Proxy = null;
reqFTP.Credentials = new NetworkCredential(username, password);
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
response = (FtpWebResponse)reqFTP.GetResponse();
stream = response.GetResponseStream();
reader = new StreamReader(stream, ConfigHelper.MyEncoding);
while (reader.Peek() > -1)
{
string x = reader.ReadLine();
if (x != null)
{
//.......
}
}
}
catch (Exception ex)
{
}
finally
{
if (reader != null)
reader.Close();
if (response != null)
response.Close();
}
J'ai essayé while ((x = reader.ReadLine()) != null)
, mais une exception de "Impossible d'accéder à un objet supprimé" a été jeté.
Enfin j'ai tout compris à l'aide de:
while (stream.CanRead && (x = reader.ReadLine()) != null)
Merci de poster le code que vous utilisez, il est difficile de commenter autrement.
OriginalL'auteur Alan | 2012-02-21
Vous devez vous connecter pour publier un commentaire.
Alors qu'il n'a pas expliquer ce qu'il se passe, je serais personnellement évitez d'utiliser
Peek
. J'avais utilisation:De cette façon, vous êtes seulement lecture en un seul endroit. C'est en quelque sorte se sent plus sain d'esprit que de vérifier si oui ou non vous peut lire, et puis la lecture.
Vous pouvez également écrire une méthode pour créer une
IEnumerable<string>
à partir d'unTextReader
(ou à partir d'unFunc<TextReader>
, ou un nom de fichier), ce qui peut rendre tout cela plus agréable. Si vous êtes en train de lire un fichier et que vous êtes en utilisant .NET 4, puisFichier.ReadLines
est déjà intégré.EDIT: Voici une des raisons pourquoi il est peut-être -1, à partir de la documentation de
StreamReader.Coup d'oeil
:Ne votre flux de chercher du soutien?
OriginalL'auteur Jon Skeet
Je ne suis pas sûr pourquoi Méthode Lire retourne -1 dans votre cas, mais l'habitude de la lecture des lignes de la Classe StreamReader à la fin du fichier est d'appeler à plusieurs reprises le Méthode ReadLine jusqu'à
null
est retourné:OriginalL'auteur dtb
Avez-vous besoin pour utiliser peek? Êtes-vous à sauter certaines lignes? Si vous voulez lire toutes les lignes de l'utiliser.
OriginalL'auteur David Jazbec
Comme indiqué dans MSDN, Méthode Lire non seulement renvoie -1 lorsque vous atteignez la fin de la rivière, mais aussi en cas d'erreurs internes:
Peut-être vérifier pour les mauvaises conversions de données dans votre commande SQL, je pense que cette méthode devrait fonctionner aussi!
OriginalL'auteur MAXE
J'ai rencontré un problème similaire lorsque vous essayez d'interagir avec une application d'authentification requis. Peek() renvoie -1 lors de la rencontre d'funky caractères (caractères unicode?) et ReadLine() a été aussi peu fiable et finirait par le blocage de ma demande, car il semble que le processus de flux Standard n'a pas été fermé.
À l'aide de la méthode Read() est la seule façon que je pouvais l'assurer, j'ai obtenu TOUS les traits et les caractères. En outre, en utilisant le Processus de " ErrorDataReceived ou OutputDataReceived les gestionnaires d'événements sont également avérés peu FIABLES (lignes manquantes). Ci-dessous comment j'ai résolu mon problème et a assuré l'ensemble de lignes et de caractères, ont été reçus:
OriginalL'auteur CaMiX