2012-03-07 1 views
3

Je travaille sur des fichiers mappés en mémoire. Est-il possible de connaître la longueur du contenu du fichier mappé en mémoire? Ce que je veux, c'est ajouter le fichier mappé en mémoire existant. Il est facile d'ajouter les octets dans le fichier, mais je cherche à ajouter une chaîne.Longueur de fichier mappé en mémoire

Nous pouvons vérifier la propriété CAPACITY, mais elle renvoie la taille des octets, je pense. Pour être plus clair, j'explique le scénario. Je crée un fichier mappé en mémoire A. J'écris "Bonjour" quand je le crée. Ça fonctionne bien. Maintenant, je veux écrire le « monde » dans le fichier existant A.

J'utilise ci-dessous le code pour cela:

var file = MemoryMappedFile.OpenExisting("myFile"); 
      string str = "String to append"; 
      using (var view = file.CreateViewAccessor()) 
      { 
       using (var stream = file.CreateViewStream()) 
       { 
        System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream); 
        writer.Write(str.ToArray(), INT SIZE,Convert.ToInt32(view.Capacity), str.Length);//Error 
       } 
      } 
      using (var stream = file.CreateViewStream()) 
      { 
       Console.WriteLine("Reading appended File"); 
       System.IO.BinaryReader reader = new System.IO.BinaryReader(stream); 
       Console.WriteLine(reader.ReadString()); 
       Console.WriteLine(string.Empty); 
      } 

J'ai marqué la ligne avec (//) qui demande la taille. Je veux connaître la valeur de (INT TAILLE) Toute aide serait appréciée.

[EDIT] J'utilise C#, Visual Studio 2010.

Maintenant, je suis en utilisant ce code à ajouter:

var file = MemoryMappedFile.OpenExisting("myFile"); 
      string str = "String to append"; 
      string str1 = string.Empty; 


      using (var stream = file.CreateViewStream()) 
      { 
       System.IO.BinaryReader reader = new System.IO.BinaryReader(stream); 

       str1 = reader.ReadString(); 
       str1 = str1 + "\n" + str; 

       System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream); 
       writer.Write(str1); 
      } 
      using (var stream = file.CreateViewStream()) 
      { 
       Console.WriteLine("Reading appended File"); 
       System.IO.BinaryReader reader = new System.IO.BinaryReader(stream); 
       Console.WriteLine(reader.ReadString()); 
       Console.WriteLine(string.Empty); 
      } 

Mais ce ne est pas quoi que ce soit annexant. Pouvez-vous s'il vous plaît vérifier mon code?

Répondre

0

Vous ne pouvez pas ajouter à une chaîne dans le flux en écrivant plus de caractère après, car cela ne changera pas la longueur de la chaîne déjà écrite.

En outre, il n'existe aucune méthode de BinaryWriter qui vous permet d'écrire à une position spécifique dans le flux comme ça. Pour la surcharge qui prend un tableau de caractères et deux entiers, le deuxième paramètre spécifie la position dans le tableau, pas la position dans le flux.

Si vous souhaitez modifier la chaîne écrite dans le flux, vous devez lire la chaîne du flux et réécrire le flux avec la nouvelle chaîne.

+0

Merci pour la réponse. Pouvez-vous s'il vous plaît re-vérifier ma question? J'ai essayé ce que je comprends de votre réponse. Mais ça ne marche pas. –

+0

@Deepak: Vous devez réinitialiser ou rouvrir le flux avant de l'écrire, sinon vous allez continer l'écriture là où vous l'avez laissé pour que la chaîne d'origine reste la première chaîne du flux. – Guffa

+0

Génial ... Ca marche. –

Questions connexes