Как написать на встроенный ресурс? - PullRequest
3 голосов
/ 17 сентября 2010

Я получаю сообщение об ошибке «Поток не доступен для записи» всякий раз, когда я пытаюсь выполнить следующий код. Я понимаю, что в памяти все еще есть ссылка на поток, но я не знаю, как решить проблему. Два блока кода вызываются в последовательном порядке. Я думаю, что второй может быть вызовом функции или двумя глубже в стеке вызовов, но я не думаю, что это должно иметь значение, так как в первом блоке есть операторы «using», которые должны автоматически очищать потоки. Я уверен, что это обычная задача в 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);
    }
}

Любая помощь будет очень ценится. Спасибо!

Andrew

Ответы [ 3 ]

11 голосов
/ 17 сентября 2010

Встроенные ресурсы скомпилированы в вашу сборку, вы не можете их редактировать.

1 голос
/ 04 декабря 2015

Немного поздно, но для потомков =) О встроенном .txt:

Да, во время выполнения вы не можете редактировать встроенный, потому что он встроенный. Вы можете немного поиграть с дизассемблером, но только с внешними сборками, которые вы будете загружать в текущем контексте.

Есть хак, если вы хотите записать на ресурс некоторую актуальную информацию до запуска программы и не хранить данные в отдельном файле.

Раньше я немного работал с winCE и компактным .Net, где нельзя было сохранять строки во время выполнения с помощью ResourceManager. Мне нужна была некоторая динамическая информация, чтобы перехватить dllNotFoundException до того, как он действительно сработает при запуске. Поэтому я сделал встроенный текстовый файл, который я заполнил на мероприятии перед сборкой.

как это:

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

здесь я получаю файлы в папке отладки

и чтение:

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

Таким образом, вы можете продолжить все свои действия в событии перед сборкой и запустить некоторые exe.

Наслаждайтесь! Он очень полезен для хранения важной информации и помогает избежать лишних действий.

1 голос
/ 15 июля 2012

Как указано выше, встроенные ресурсы доступны только для чтения. Моя рекомендация, если это применимо, ( скажем, например, ваш встроенный ресурс был файлом базы данных, XML, CSV и т. Д. ), состоит в том, чтобы извлечь пустой ресурс в то же место, что и программа, и прочитать / написать в извлеченный ресурс.

Пример псевдокода:

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.

Надеюсь, это поможет.

Дополнительно:

Ваш встроенный ресурс может быть полностью пустым, содержать структуру данных и / или значения по умолчанию.

...