C#: faire Précéder le début d'un fichier
Quelle est la meilleure façon d'ajouter du texte au début d'un fichier à l'aide de C#?
Je ne pouvais pas trouver un moyen simple de faire cela, mais il est venu avec un couple de solutions de rechange.
-
Ouvrir un nouveau fichier, écrire le texte que je voulais ajouter, ajoutez le texte de l'ancien fichier à la fin du nouveau fichier.
-
Puisque le texte que je veux ajouter doivent être à moins de 200 caractères, je pensais que je pourrais ajouter de l'espace des caractères au début du fichier, et ensuite remplacer le blanc de l'espace avec le texte que je voulais ajouter.
Quelqu'un d'autre a rencontré ce problème, et si oui, qu'avez-vous fait?
- Question intéressante. Clairement le cadre (et sans doute sous-jacents du système de fichiers) est ajouter biaisée, depuis Fichier.AppendText et Fichier.AppendAllText sont fournis sans le faire précéder de méthodes. Sens -- octets peuvent être ajoutés sans "bouger" le contenu existant.
- Vous pouvez vérifier cette stackoverflow.com/questions/1008742/... post sur l'Ajout de texte au début et à la fin du fichier en C#. Son pour les fichiers XML, mais facilement modifiable pour votre utilisation.
- hmm ok, donc les réponses semblent en faveur de l'option 1 (soit à l'aide d'un fichier temporaire ou de lecture en mémoire). Est-il une faille avec l'aide de l'option 2?
- Comment dois-je faire cela au sein d'un fichier existant, permet de dire qu'il cherche un mot spécifique, qui peut être n'importe où dans le fichier?
Vous devez vous connecter pour publier un commentaire.
Ajouter au début du fichier (les préfixant par opposition à l'ajout à la fin) n'est généralement pas une opération pris en charge. Votre #1 options est très bien. Si vous ne pouvez pas écrire un fichier temp, vous pouvez retirer la totalité du fichier en mémoire, preprend vos données dans le tableau d'octets, puis écraser le dos (ce qui n'est vraiment possible que si vos fichiers sont petits et que vous n'avez pas à avoir un tas dans la mémoire à la fois parce que les préfixant le tableau n'est pas nécessairement facile sans une copie).
Cela fonctionne pour moi, mais pour les petits fichiers. Probablement ce n'est pas une très bonne solution sinon.
Je pense que la meilleure façon est de créer un fichier temporaire. Ajoutez votre texte puis de lire le contenu du fichier d'origine de l'ajouter au fichier temp. Ensuite, vous pouvez remplacer l'original avec le fichier temp.
L'algorithme suivant pour résoudre le problème assez facilement, c'est le plus efficace pour n'importe quelle taille de fichier, y compris les très gros fichiers texte:
à l'aide de deux ruisseaux, vous pouvez le faire en place, mais gardez à l'esprit que ce sera encore une boucle sur l'ensemble du dossier sur chaque ajout
Vous devriez être en mesure de le faire sans l'ouverture d'un nouveau fichier. Utiliser le Fichier suivant de la méthode:
En veillant à spécifier FileAccess.ReadWrite.
À l'aide de la FileStream retourné à partir d'un Fichier.Ouvrir, lire toutes les données existantes dans la mémoire. Puis réinitialiser le pointeur au début du fichier, écrire vos nouvelles données, puis d'écrire les données existantes.
(Si le fichier est gros et/ou vous êtes suspect d'utiliser trop de mémoire, vous pouvez le faire sans avoir à lire tout le fichier en mémoire, mais la mise en œuvre de ce qui est laissé en exercice au lecteur.)
Ouais, fondamentalement, vous pouvez utiliser quelque chose comme ceci:
Puis
Pas vraiment efficace bien que dans le cas de gros fichiers.
L'utilisation de cette classe:
ajouter:
Même si ce que vous écrivez est petit, le Temp de fichier est l'ensemble du fichier d'origine annexé à elle avant le .Replace(), donc il n'a besoin d'être sur le disque.
Noter que ce code n'est pas Thread-safe; si plus d'un thread accède à ce code, vous pouvez perdre de l'écrit dans les applications d'échange de fichiers qui se passe ici. Cela dit, il est aussi assez cher, de sorte que vous voudriez porte d'accès de toute façon passe - écrit par le biais de multiples Fournisseurs d'un tampon, qui est périodiquement vide par l'intermédiaire de ce faire précéder de la méthode sur un seul thread Consommateur.
Mettre le contenu du fichier dans une chaîne de caractères. Ajoutez de nouvelles données que vous souhaitez ajouter à la partie supérieure du fichier à chaîne --
string = newdata + string
. Déplacez ensuite le chercher à la position du fichier à 0 et écrire la chaîne de caractères dans le fichier.