2013-09-15 3 views
5

Я пытаюсь получить доступ к текстовому файлу «achInfo.txt» из моих ресурсов в Visual Studio. Некоторые обходные пути уже указаны на этом сайте, но ни один из них, похоже, не работает для меня. Они просто дают мне одну из двух ошибок, о которых я расскажу позже.Visual Studio 2012 - C#: Чтение файла .txt из ресурсов

Вот и весь метод.

private string[] GetAchMetadata(short element) 
{ 
    string[] temp = { "", "" }; 
    string cLine; 
    try 
    { 
     StreamReader sr = new StreamReader(Properties.Resources.achInfo); 
     while (!sr.EndOfStream) 
     { 
      cLine = sr.ReadLine(); 
      if (Microsoft.VisualBasic.Information.IsNumeric(cLine)) 
      { 
       if (int.Parse(cLine) == element) 
       { 
        temp[0] = cLine; 
        temp[1] = sr.ReadLine(); 
        return temp; 
       } 
      } 
     } 

    } 
    catch (Exception e) 
    { 
     System.Diagnostics.Debug.WriteLine("There was a problem in collecting data."); 
     System.Diagnostics.Debug.Write(e); 
    } 

    return temp; 
} 

Моего первое предположение было использовать Properties.Resources.achInfo, так как это относится непосредственно к файлу в вопросе. Однако это вызывает ошибку System.ArgumentException с описанием «Недопустимые символы в пути».

Затем я использовал сборочный решение («Grandma_Lair» быть моим пространством имен, не спрашивайте.):

Assembly asm; 
asm = Assembly.GetExecutingAssembly(); 
StreamReader sr = new StreamReader(asm.GetManifestResourceStream("Grandma_Lair.achInfo.txt")); 

Но, это бросает System.ArgumentNullException с сообщением „Значение не может быть пустым“. Я также установил модификатор доступа на свои ресурсы для публики, и я убедился, что для этого файла установлен встроенный ресурс.

Есть ли у кого-нибудь идеи по моей проблеме?

+0

Вы сказали, что файл установлен в Embedded Resource, но это действие копирования установлено ничем иным, чем «Never copy»? –

ответ

3

Ваше первое решение должно работать, как только вы замените StreamReader с StringReader:

StringReader sr = new StringReader(Properties.Resources.achInfo); 

Значение Properties.Resources.achInfo представляет собой ресурс, который внедренный во всей своей полноте дал вам в виде строки, а не путь к этому ресурсу (отсюда ошибка «недопустимые символы в пути»).

Подход GetManifestResourceStream тоже должен работать, но вам нужно дать метод правильному пути, который, среди прочего, основан на имени пространства имен по умолчанию для вашего проекта. Если вы добавите вызов assembly.GetManifestResourceNames(), прежде чем пытаться получить свой ресурс, и посмотрите точное написание имени вашего ресурса в отладчике, вы также сможете исправить проблему исключения нулевого указателя.

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