2016-03-03 4 views
2

У меня встроен sample.txt (он содержит только одну строку «aaaa») в ресурсы проекта, как в этом answer. Когда я пытаюсь прочитать это так:Чтение файла из ресурсов

string s = File.ReadAllText(global::ConsoleApplication.Properties.Resources.sample); 

Я получаю System.IO.FileNotFoundException»исключение. Дополнительная информация: Не удалось найти файл 'd: \ Work \ Projects \ MyTests \ ConsoleApplication \ ConsoleApplication \ bin \ Debug \ aaaa'.

Так что, похоже, он пытается взять имя файла из моего файла ресурсов вместо чтения этого файла. Почему это происходит? И как я могу сделать это прочитать sample.txt

Попытка решения @Ryios и получение Аргумент исключения нулевого

using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ConsoleApplication.Resources.sample.txt")) 
     { 
      TextReader tr = new StreamReader(stream); 
      string fileContents = tr.ReadToEnd(); 
     } 

Файл находится в D: \ Work \ Projects \ MyTests \ ConsoleApplication \ ConsoleApplication \ Resources \ sample.txt

ps Решаемые. Мне пришлось установить Build Action - вставить ресурс в свойства sample.txt.

+0

Можете ли вы показать нам строку, сохраненную в параметре образца? Кажется, у него есть некоторые недопустимые символы для пути к файлу. – ManoDestra

+0

Что произойдет, если вы отбросите глобальную :: часть от этого – BugFinder

+0

Если вы не заблокированы в использовании файла ресурсов, вы можете захотеть вставить этот файл, как в http://stackoverflow.com/questions/3314140/how-toreadread -embedded-resource-text-file? rq = 1. Это проще в обслуживании. –

ответ

7

Файлы ресурсов с файлом File.ReadAllText не читаются.

Вместо этого вам нужно открыть поток ресурсов с Assembly.GetManifestResourceStream.

Вы также не передаете ему путь, вы передаете ему пространство имен. Пространство имен этого файла будет представлять собой пространство имен по умолчанию Assemblies + иерархия папки в проекте, файл находится в + имя файла.

Представьте себе такую ​​структуру

  • проекта (xyz.project)
    • Folder1
      • Folder2
        • Somefile.txt

Так пространство имен файла будет:

xyz.project.Folder1.Folder2.SomeFile.Txt

Тогда вы читали его, как так

 using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("xyz.project.Folder1.Folder2.SomeFile.Txt")) 
     { 
      TextReader tr = new StreamReader(stream); 
      string fileContents = tr.ReadToEnd(); 
     } 
+0

Я обновил вопрос, пожалуйста, просмотрите – Dork

+0

Да, строите действие Установите как ресурс. –

2

Здравствуйте предложенное решение не работает

Это возвращение нулевой Assembly.GetExecutingAssembly(). GetManifestResourceStream ("xyz.project.Folder1. Folder2.SomeFile.Txt ")

Другой способ заключается в использовании MemoryStream из Ressource данных

byte[] aa = Properties.Resources.YOURRESSOURCENAME; 
    MemoryStream MS =new MemoryStream(aa); 
    StreamReader sr = new StreamReader(MS); 

Не идеален, но он работает

Смежные вопросы