2013-04-06 3 views
1

Я видел несколько сообщений, дающих примеры того, как читать из текстовых файлов, и примеры того, как создать строку «public» (static или const), но я не был способный объединить два внутри «функции» таким образом, который имеет смысл для меня.C# чтение переменных в статическую строку из текстового файла

У меня есть текстовый файл под названием «MyConfig.txt». В этом случае у меня есть 2 строки.

MyPathOne=C:\TestOne 
MyPathTwo=C:\TestTwo 

Я хочу, чтобы иметь возможность прочитать этот файл, когда я начинаю форму, делая как MyPathOne и MyPathTwo доступны из любой точки внутри формы, используя что-то вроде этого:

ReadConfig("MyConfig.txt"); 

так, как я пытаясь сделать это сейчас, что не работает, это:

public voice ReadConfig(string txtFile) 
{ 
    using (StreamReader sr = new StreamResder(txtFile)) 
    { 
     string line; 
     while ((line = sr.ReadLine()) !=null) 
     { 
      var dict = File.ReadAllLines(txtFile) 
          .Select(l => l.Split(new[] { '=' })) 
          .ToDictionary(s => s[0].Trim(), s => s[1].Trim()); 
     } 
     public const string MyPath1 = dic["MyPathOne"]; 
     public const string MyPath2 = dic["MyPathTwo"]; 
    } 
} 

файл TXT, вероятно, никогда не вырастет более чем 5 или 6 строк, и я не застрял на использовании StreamReader или словаря.

Пока я могу получить доступ к переменным пути по имени из любого места, и он не добавляет, как 400 строк кода или что-то в этом роде, тогда я в порядке с тем, что было бы лучше, безопаснее, быстрее и проще.

Я прочитал много сообщений, где люди говорят, что данные должны храниться в XML, но я считаю, что эта часть действительно не имеет большого значения, потому что чтение файла и получение части переменных будет практически одинаковым в любом случае. В остальном я предпочел бы использовать простой текстовый файл, который может редактировать кто-то (конечный пользователь), не понимая XML. (что означает, конечно, много проверок пустых строк, существует ли путь и т. д. ... Я в порядке с этой частью, просто хочу, чтобы эта часть работала в первую очередь).

Я читал о различных способах использования ReadAllLines в массиве, а некоторые говорят о создании нового отдельного «класса» файла (которого я пока не понимаю ... но работаю над ним). В основном я хочу найти «стабильный» способ сделать это. (проект используется .Net4 и Linq кстати)

Спасибо!

+0

Возможно ли, что у вас есть класс и массив или список, который содержит строки из текстового файла. вы можете создать одноэлементный объект, доступный везде. и когда вы создаете экземпляр объекта singleton, прочитайте файл. - http://msdn.microsoft.com/en-us/library/ff650316.aspx – dekdev

+0

Что не работает с вашим текущим кодом? –

ответ

0

Код, который вы предоставили, даже не компилируется. Вместо этого, вы можете попробовать это:

public string MyPath1; 
public string MyPath2; 

public void ReadConfig(string txtFile) 
{ 
    using (StreamReader sr = new StreamReader(txtFile)) 
    { 
     // Declare the dictionary outside the loop: 
     var dict = new Dictionary<string, string>(); 

     // (This loop reads every line until EOF or the first blank line.) 
     string line; 
     while (!string.IsNullOrEmpty((line = sr.ReadLine()))) 
     { 
      // Split each line around '=': 
      var tmp = line.Split(new[] { '=' }, 
           StringSplitOptions.RemoveEmptyEntries); 
      // Add the key-value pair to the dictionary: 
      dict[tmp[0]] = dict[tmp[1]]; 
     } 

     // Assign the values that you need: 
     MyPath1 = dict["MyPathOne"]; 
     MyPath2 = dict["MyPathTwo"]; 
    } 
} 

принять во внимание:

  1. Вы не можете объявлять открытые поля в методы.

  2. Вы не можете инициализировать поля const во время выполнения. Вместо этого вы предоставляете постоянное значение для них во время компиляции.

+0

Спасибо! Если бы я хотел добавить MyPath3 и сделать что-то вроде MyPath3 = MyPath1 + @ "\ Test" и иметь возможность ссылаться на это, я бы определил, что и на самом верху (и будет ли это работать, или я бы использовал какой-то «комбайн» ' заявление?)? – CopalFreak

0

Вам необходимо определить переменные вне функции, чтобы сделать их доступными для других функций.

public string MyPath1; // (Put these at the top of the class.) 
public string MyPath2; 

public voice ReadConfig(string txtFile) 
{ 
    var dict = File.ReadAllLines(txtFile) 
        .Select(l => l.Split(new[] { '=' })) 
        .ToDictionary(s => s[0].Trim(), s => s[1].Trim()); // read the entire file into a dictionary. 

    MyPath1 = dict["MyPathOne"]; 
    MyPath2 = dict["MyPathTwo"]; 
} 
0

Got it. Благодаря!

  public static string Path1; 
      public static string Path2; 
      public static string Path3; 

      public void ReadConfig(string txtFile) 
      { 
       using (StreamReader sr = new StreamReader(txtFile)) 
       { 
       var dict = new Dictionary<string, string>(); 
       string line; 
       while (!string.IsNullOrEmpty((line = sr.ReadLine()))) 
       { 
          dict = File.ReadAllLines(txtFile) 
          .Select(l => l.Split(new[] { '=' })) 
          .ToDictionary(s => s[0].Trim(), s => s[1].Trim()); 
       } 
       Path1 = dict["PathOne"]; 
       Path2 = dict["PathTwo"]; 
       Path3 = Path1 + @"\Test"; 
       } 
      } 
0

Этот вопрос похож к Get parameters out of text file

(я ставлю там ответ. Я "не могу" вставить здесь.)

(Неуверенные ли я должен "флаг" это как «дублировать». «Флажок» «закрывается».)

(повторяются ли какие-либо вопросы?) Каждый может иметь достоинства в формулировке [часто хромого] вопроса или ответов [underreaching and overreaching]. ted версия может быть лучше всех, но консолидация редко бывает тривиальной.)

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