Quand je sauve l'enregistrement du contenu de la chaîne [] avec System.IO.file.wreealllines, à la fin d'un fichier est toujours laissé une ligne vide. Par exemple: produit fichier (sans soulignement): p> Il y avait déjà un tel sujet: C'est un bug? Comment puis-je vous en débarrasser facilement (pour l'instant, je l'ignore tout simplement lorsque vous lisez à nouveau le fichier)? P> P>
9 Réponses :
WriteAlllines écrit chaque entrée de votre tableau et appendez une nouvelle ligne.
Comme vous pouvez le constater, chaque chaîne est sur sa propre ligne, cela signifie que votre dernière entrée est la nouvelle ligne terminée et que vous voyez une ligne de plus dans le fichier. Vous pouvez le prouver avec une vidage hexdécimale du fichier p>
regarder sur le code source des writealllines confirme ceci.
Interne, il utilise le textwriter.writeline (string) méthode. p>
La méthode code> WriteAllines code> écrira chaque ligne de votre tableau suivi d'une pause à la ligne. Cela signifie que vous obtiendrez toujours cette "ligne vide" dans votre fichier. p>
Le point réalisé dans le message que vous avez lié est que lors de l'exécution Si vous lisez le fichier de manière différente, vous devrez vous gérer vous-même. P>
essentiellement ce que vous voyez est un comportement attendu. P> readalllines code> qui considère une ligne à des caractères terminés par une pause de ligne. Ainsi, lorsque vous utilisez la méthode de lecture sur le fichier, vous venez d'écrire, vous devez obtenir exactement les mêmes lignes. P>
Je comprends que la meilleure façon de se débarrasser de ce sera simplement en utilisant wridealltext code> avec
string.join code> avec
\ r \ n code> comme séparateur?
Regardez également chez Cette question sur les performances de String.Join et StringBuilder
Comme il y a toujours une "dernière ligne", que ce soit vide ou non, je ne comprends pas pourquoi la dernière ligne écrite doit être vide. Le dernier élément de tableau résultant de Readalllines est une ligne de fichier qui ne se termine pas avec une pause de ligne - c'est la dernière ligne. Comparez les fichiers enregistrés par WriteAllines avec des fichiers enregistrés par XMLSerializer.Sérialize et vous verrez ce que je veux dire.
@Tiagofreitasleal: tout ce que j'ai à faire avec ce que j'ai dit dans mon premier paragraphe. La manière dont le code fonctionne est d'écrire chaque élément de votre tableau suivi d'une pause de ligne. Cela signifie que le dernier élément de votre tableau sera suivi d'une pause à la ligne. Cela signifie que le fichier se termine dans une pause de ligne qui signifie alors qu'il existe une chaîne vide sur cette dernière ligne. Il s'agit d'un produit nécessaire de toute représentation de cette nouvelle ligne de suivi (si vous n'êtes pas sûr de savoir pourquoi considérer la différence entre le même dossier avec et sans cette nouvelle ligne de suivi).
Également en réponse à "Le dernier élément de tableau résultant de Readalllines est une ligne de fichier qui ne se termine pas avec une pause de ligne" - ce n'est pas vrai. Vous pouvez vous attendre à ce que le comportement soit qu'il met une nouvelle ligne entre chaque article qui n'entraînerait aucune nouvelle ligne à la fin du fichier. Ce n'est pas comme ça que ça marche. En interne, il fait à peu près un foreach code> à travers l'entrée et pour chaque élément, il fait un
Writeeline code>. Le
WriteRine code> est pourquoi chaque article se termine par une nouvelle ligne. Tout ce que vous pensez que la bonne façon de faire cela n'est bien sûr pas importante, c'est simplement la façon dont le code fonctionne.
C'est la façon dont Microsoft l'a fait mais cela ne signifie pas que c'est bien fait. Avez-vous essayé de lire un fichier qui ne se termine pas avec une rupture de ligne en utilisant Readalllines? Cette dernière ligne fait partie de la matrice. Lors de la lecture, les lignes se terminent par des pauses de ligne ou de la fin du fichier. Lorsque vous écrivez, toutes les lignes doivent se terminer par une pause de ligne. Si vous prenez un fichier qui ne se termine pas avec une pause à la ligne et des lignes de readall suivies de WriteAllines, les changements de taille de fichier et mon SVN se plaint. Mais peu importe, dans la prochaine réponse, nous avons une méthode WriteAllinesBetter qui résout le problème.
@AtigofreitasLeal: Vous aurez peut-être raison et qu'il aurait été préférable de ne pas avoir la cassure de la ligne de fin, mais la méthode n'est que l'une des nombreuses pour écrire du contenu à un fichier. Si vous n'aimez pas leur façon rapide et sale de faire des choses, c'est trivial pour écrire quelque chose qui fait ce que vous voulez.
Comme d'autres ont souligné, c'est comme ça que ça marche. Voici une méthode qui le fait sans la nouvelle ligne supplémentaire: utilisation: p> écrit: p>
Fonctionne comme un charme.
J'ai fait la même chose en ajoutant une ligne: 3, espérons que cela aide quelqu'un
Pour vous débarrasser de la nouvelle ligne de fuite, la meilleure solution serait, lorsque vous le lisez avec .ReadAllines () code> pour rejeter réellement le dernier élément de votre éventail de chaînes. P>
Ce serait une solution partielle au cas où une chaîne vide est réellement lue dans la structure de la matrice de réception. La question indique que ce n'est pas en fait le cas.
Le moyen le plus simple de le faire était d'utiliser Appendalltext pour la dernière ligne:
if ($i -ne $lines.Count - 1){ $newLines += $lines[$i] } else { $lastLine = $lines[$i] } [IO.File]::WriteAllLines($file.FullName, $newLines); [IO.File]::AppendAllText($file.FullName, $lastLine);
@VirtLink Solution est presque em> parfait. En fait, il existe un scénario où vous obtiendrez des ordures à la fin du fichier - lorsque le fichier existe et que son contenu est plus grand que le nouveau contenu. Avant de tendre le nouveau contenu de fichier, il suffit de réinitialiser la longueur de fichier à zéro. public static void WriteAllLinesBetter(string path, params string[] lines)
{
if (path == null)
throw new ArgumentNullException("path");
if (lines == null)
throw new ArgumentNullException("lines");
using (var stream = File.OpenWrite(path))
{
stream.SetLength(0);
using (var writer = new StreamWriter(stream))
{
if (lines.Length > 0)
{
for (var i = 0; i < lines.Length - 1; i++)
{
writer.WriteLine(lines[i]);
}
writer.Write(lines[lines.Length - 1]);
}
}
}
}
Je suis venu tout cela aussi, bon endroit. Bravo pour la modification de Var Writer Code>.
Il y a une solution de contournement plus simple:
Vous pouvez également enregistrer un fichier avec WriteAlltext et joindre une matrice de lignes manuellement comme:
La dernière entrée de la matrice se termine-t-elle avec une nouvelle ligne?
J'ai montré un tableau exemplaire donné comme argument: ["A", "B", "C"] Il ne contient que des lettres habituelles.