2015-07-07 5 views
0

У меня есть приложение Windows Form, которое я переписал с помощью Compact Framework 3.5. В исходном приложении у меня был блок кода, который я использовал для чтения в файле, и пропустил его первые 4 строки.Как пропустить строки при чтении в файле с использованием компактной рамки 3.5

Вот блок кода, который работает отлично:

var openFile = File.OpenText(fullFileName); 
      var fileEmpty = openFile.ReadLine(); 
      if (fileEmpty != null) 
      { 
       var lines = File.ReadAllLines(fullFileName).Skip(4); //Will skip the first 4 then rewrite the file 
       openFile.Close();//Close the reading of the file 
       File.WriteAllLines(fullFileName, lines); //Reopen the file to write the lines 
       openFile.Close();//Close the rewriting of the file 
      } 

мне пришлось переписать этот код, так как он не может быть использован как и в Compact Framework.

Вот мой код:

var openFile = File.OpenText(fullFileName); 
      var fileEmpty = openFile.ReadLine(); 
      if (fileEmpty != null) 
      { 
       var sb = new StringBuilder(); 
       using (var sr = new StreamReader(fullFileName)) 
       { 
        string line1; 
        // Read and display lines from the file until the end of 
        // the file is reached. 
        while ((line1 = sr.ReadLine().Skip(4).ToString()) != null) //Will skip the first 4 then rewrite the file 
        { 
         sb.AppendLine(line1); 
        } 
       } 

Однако, когда я бегу выше, я получаю ошибку на (while ((line1 = sr.ReadLine().Skip(4).ToString()) != null)) ArgumentNullException было необработанное и значение не может быть пустым.

Может кто-нибудь, пожалуйста, скажите мне, как я могу это сделать в компактном каркасе?

+0

Извините, мое незнание, но почему нельзя использовать первый образец? Это потому, что 'File.ReadAllLines()' и 'File.WriteAllLines()' недоступны в CF? –

+0

@GrantWinney, что было бы правильно. – nate

ответ

2

С sr.ReadLine() возвращает одну строку, это будет пропускать первые четыре символа в вашей строке, вернуть остальное как массив символов, а затем вызвать на нем ToString() ... не то, что вы хотите.

sr.ReadLine().Skip(4).ToString() 

Причина вы получаете в ArgumentNullException, потому что в конечном счете sr.ReadLine() возвращает null строку, и при попытке пропустить первые четыре символа null строки, он бросает, как вы можете видеть, глядя на реализация для Skip():

public static IEnumerable<TSource> Skip<TSource>(this IEnumerable<TSource> source, int count) 
{ 
    if (source == null) 
     throw new ArgumentNullException("source"); 

    return SkipIterator<TSource>(source, count); 
} 

Сохраняя большую часть вашего кода то же самое, вы можете просто прочитать первые несколько строк и ничего не делать с ними (если вы определенно будете иметь по крайней мере, 4 строки в файле).

using (var sr = new StreamReader(fullFileName)) 
{ 
    // read the first 4 lines but do nothing with them; basically, skip them 
    for (int i=0; i<4; i++) 
     sr.ReadLine(); 

    string line1; 

    while ((line1 = sr.ReadLine()) != null) 
    { 
     sb.AppendLine(line1); 
    } 
} 
+0

Попытка этого сейчас ... – nate

+0

Это сработало благодаря – nate