2015-07-07 3 views
0

В рамках .net с помощью приложения Windows Forms я могу очистить файл, а затем записать данные, которые я хочу вернуть в этот файл.Как удалить все строки в файле, а затем переписать файл в Compact Framework 3.5 C#

Вот код, который я использую в Windows Forms:

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 
      } 
      openFile.Close(); 
      openFile.Dispose(); 

Я пытаюсь сделать то же самое компактную рамку. Я могу сохранить строки, которые я хочу, а затем удалить все строки в файле. Однако я не могу переписать файл.

Вот моя компактная структура кода:

var sb = new StringBuilder(); 

       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); 
        } 
       } 
       string allines = sb.ToString(); 

       openFile.Close();//Close the reading of the file 
       openFile.Dispose(); 

       //Reopen the file to write the lines 
       var writer = new StreamWriter(fullFileName, false); //Don't append! 
       foreach (char line2 in allines) 
       { 
        writer.WriteLine(line2); 
       } 
       openFile.Close();//Close the rewriting of the file 
      } 
      openFile.Close(); 
      openFile.Dispose(); 
+2

Что вы подразумеваете под «Я не могу»? Что происходит? (Вы также должны использовать инструкции 'using' для вашего автора ... и неясно, почему вы закрываете его три раза. Это не помогает вам не форматировать ваш код и не показывать, где' openFile' сначала открылся ...) –

ответ

1

Ваш код

foreach (char line2 in allines) 
{ 
    writer.WriteLine(line2); 
} 

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

Помните, что allines - это единственная строка, которая имеет окружение Environment.NewLine между исходными строками файла.

То, что вы, вероятно, намерены сделать, это просто

writer.WriteLine(allines); 

UPDATE

Вы закрываете OpenFile несколько раз (вы должны сделать это только один раз), но вы не промывке или закрытия ваш писатель.

Попробуйте

using (var writer = new StreamWriter(fullFileName, false)) //Don't append! 
{ 
    writer.WriteLine(allines); 
} 

обеспечить писатель расположен и поэтому очищено.

+0

Я пробовал это, и я все равно получаю тот же результат. Он удалил все данные из файла, но после того, как он ударил 'writer.WriteLine (allines);' он не записывает данные обратно в файл. – nate

+0

Вы получаете исключение при попытке написать письмо? –

+0

Также см. Мое обновление. –

0

Если вы планируете сделать это, чтобы иметь что-то вроде «вращающегося» буфера для файла журнала, считайте, что большинство устройств Windows CE использует флешку в качестве носителя для хранения данных, и ваш подход будет генерировать полную перезапись всего файла (всего - 4 строки) каждый раз. Если это случается довольно часто (каждые несколько секунд), это может носить нашу вспышку, достигая максимального количества циклов стирания быстро (быстро может означать несколько недель или месяцев). Альтернативный подход будет переименовать старый файл журнала, когда он достигнет максимального размера (удалив любой существующий файл с тем же именем) и создаст новый. В этом случае информация о регистрации будет разделена на два файла, но вы всегда будете добавлять к существующим файлам, ограничивая количество выполняемых операций записи. Также переименование или удаление файла не являются тяжелыми операциями с точки зрения файловой системы флэш-памяти.