2010-09-17 7 views
2

Je reçois toujours l'erreur "Stream was not writable" chaque fois que j'essaie d'exécuter le code suivant. Je comprends qu'il y a toujours une référence au flux dans la mémoire, mais je ne sais pas comment résoudre le problème. Les deux blocs de code sont appelés dans un ordre séquentiel. Je pense que le second pourrait être un appel de fonction ou deux plus profonds dans la pile d'appels, mais je ne pense pas que cela devrait avoir de l'importance, puisque j'ai "utiliser" des instructions dans le premier bloc qui devraient nettoyer les flux automatiquement. Je suis sûr que cela est une tâche commune en C#, j'ai juste aucune idée de comment le faire ...Comment lire, puis écrire dans une ressource incorporée dans C#

string s = ""; 

using (Stream manifestResourceStream = 
    Assembly.GetExecutingAssembly().GetManifestResourceStream("Datafile.txt")) 
{ 
    using (StreamReader sr = new StreamReader(manifestResourceStream)) 
    { 
     s = sr.ReadToEnd(); 
    } 
} 

...

string s2 = "some text"; 

using (Stream manifestResourceStream = 
    Assembly.GetExecutingAssembly().GetManifestResourceStream("Datafile.txt")) 
{ 
    using (StreamWriter sw = new StreamWriter(manifestResourceStream)) 
    { 
     sw.Write(s2); 
    } 
} 

Toute aide sera très appréciée. Merci!

Andrew

+0

Uhm .. ce n'est pas tout à fait vrai. J'ai des applications semblent modifier les ressources embarquées. Qu'est-ce qu'ils ont fait, il a chargé l'exe dans un flux, puis l'encoder en ASCII. En faisant cela, vous remarquerez que votre fichier XML s'affichera. Donc ce qu'ils ont fait alors était de rechercher l'index du début du fichier XML et en quelque sorte remplacé les octets dans l'exécutable avec le nouveau fichier xml. Je ne sais pas comment ils l'ont fait et je ne pourrais pas le faire encore mais je sais que c'est possible. –

Répondre

6

ressources intégrées sont compilés dans votre assemblée, vous ne pouvez pas les modifier.

+2

Oups, merci, je ne le savais pas. Savez-vous s'il est possible d'écrire sur une ressource qui fait partie du programme sans avoir les données dans un fichier séparé? – Andrew

+0

Je crois que c'est un problème de sécurité. Je sais que dans Windows 7, un programme n'est pas autorisé à modifier le contenu de son répertoire Program Files. Windows joue de la magie noire avec un logiciel hérité, mais cela est généralement considéré comme une mauvaise pratique. – Jordan

+0

peut dll écrire à lui-même, cependant, lorsqu'il est exécuté par un autre assembly? – DevDave

1

Comme indiqué ci-dessus, les ressources intégrées sont en lecture seule. Ma recommandation, si cela applicable, (disent par exemple votre ressource incorporée est un fichier de base de données, XML, CSV, etc.) serait d'extraire une ressource vierge au même endroit que le programme, et en lecture/écriture à l'extrait Ressource.

Exemple Pseudo code:

if(!Exists(new PhysicalResource())) //Check to see if a physical resource exists. 
{ 
    PhysicalResource.Create(); //Extract embedded resource to disk. 
} 

PhysicalResource pr = new PhysicalResource(); //Create physical resource instance. 

pr.Read(); //Read from physical resource. 

pr.Write(); //Write to physical resource. 

Hope this helps.

supplémentaires:

Votre ressource incorporée peut être entièrement vide, contiennent la structure de données et/ou des valeurs par défaut.

1

Un peu en retard, mais pour les descendants =) A propos embarqué txt:

Eh oui, le temps d'exécution, vous ne pouviez pas modifier intégré parce que son embarqué. Vous pourriez jouer un peu avec le désassembleur, mais seulement avec des assemblages d'outters, que vous allez charger dans le contexte actuel.

Il est un hack si vous voulez écrire à une ressource des informations réelles, avant programm commence, et de garder pas les données dans un fichier séparé.

Je avais travaillé un peu avec winCE et .Net compact, où vous ne pouvait pas permettre de stocker des chaînes à l'exécution avec ResourceManager. J'avais besoin d'informations dynamiques, afin d'attraper dllNotFoundException avant de lancer réellement au démarrage. J'ai donc fait un fichier txt intégré, que j'ai rempli lors de l'événement de pré-construction.

comme ceci:

cd $(ProjectDir) 
dir ..\bin\Debug /a-d /b> assemblylist.txt 

ici je reçois des fichiers dans le dossier de débogage

et la lecture:

using (var f = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("Market_invent.assemblylist.txt"))) 
     { 
      str = f.ReadToEnd(); 
     } 

vous pouvez donc procéder à toutes vos actions en cas de pré-construction exécuter certains exes.

Profitez-en!C'est très utile pour stocker des informations importantes et éviter les actions redondantes.