2014-11-12 6 views
-1

Я пытаюсь удалить определенную строку из файла на IsolatedStorage, но я до сих пор получающего «поток не записываемый» из следующего метода:поток не был записываемые (StreamWriter)

public async static void RemoveFavoriteFromFile(int id) 
{ 
    string favoriteFilename = Globals.FavoriteFilepath; 
    StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder; 
    var folder = await local.GetFolderAsync("DataFolder"); 
    var file = await folder.OpenStreamForReadAsync(Globals.FavoriteFilepath); 
    using (StreamReader sr = new StreamReader(file)) 
    {     
     using (StreamWriter sw = new StreamWriter(file)) 
     { 
      string line = null; 
      while ((line = sr.ReadLine()) != null) 
      { 
       if (String.Compare(line, id.ToString()) == 0) 
        continue; 
       sw.WriteLine(line); 
      } 
     } 
    } 
} 

на линии using (StreamWriter sw = new StreamWriter(file))

Может ли кто-нибудь помочь мне, пожалуйста?

Заранее спасибо

EDIT: я главным образом прошу Вас посоветовать мне, как удалить определенную строку из не существующего файла, независимо от того, что я создал уже. Основная проблема для меня в понимании заключается в том, что как писать/редактировать файл, который мне в первую очередь нужно прочитать для поиска конкретной строки.

+3

Вы не можете читать и писать из/в текстовый поток одновременно, содержимое файла будет безнадежно перепутано. Имя «OpenStreamForReadAsync» должно принести этот пункт домой, этот поток доступен только для чтения. Не пытайтесь найти метод «OpenStreamForReadWriteAsync», его не существует. –

+0

«Почему, когда я открываю поток только для чтения, я не могу написать ему», на самом деле не отвечает на вопрос в терминах, приемлемых для SO. Просьба уточнить, какую дополнительную информацию вам нужно понять, что сообщение об ошибке. Если вы ищете помощь в удалении строки - пожалуйста, обновите свой вопрос, чтобы он ясно понял, с чем вам нужна помощь, и что вы пробовали. –

+0

Спасибо, ребята, за разъяснения. Я отредактировал мою статью о происхождении с дополнительным вопросом. –

ответ

1

Чтение и письмо в один и тот же файл одновременно - это плохая идея.

Либо пишите в файл подкачки "filename_swap.txt". После того, как он закончит запись всего файла, удалите исходный файл и переименуйте файл filename_swap.txt в исходный файл (в основном заменив его).

Или вы можете прочитать весь файл в буфер, закройте файл. Внесите изменения в указанный буфер, затем снова откройте файл для записи. На этот раз напишите все содержимое модифицированного буфера.


Так позволяет модуляризуете программа

using System.Threading.Tasks; 

// read the specific file into a string buffer 
private async Task<string> ReadFileIntoBuffer(string fileName) 
{ 
    string buffer = "";                 // our buffer 

    StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;   // local folder 
    var folder = await local.GetFolderAsync("DataFolder");        // sub folder 

    // open the file for reading       
    using (Stream s = await folder.OpenStreamForReadAsync(fileName)) 
    { 
     using (StreamReader sr = new StreamReader(s)) 
     { 
      buffer = await sr.ReadToEndAsync(); 
     } 
    } 

    // return the buffer 
    return buffer; 
} 

// write the string buffer to a specific file 
private async Task<bool> WriteBufferToFile(string fileName, string buffer) 
{ 
    try 
    { 

     StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;   // local folder 
     var folder = await local.GetFolderAsync("DataFolder");        // sub folder 

     // open the file for writing 
     using (Stream s = await folder.OpenStreamForWriteAsync(fileName, CreationCollisionOption.ReplaceExisting)) 
     { 
      using (StreamWriter sw = new StreamWriter(s)) 
      { 
       await sw.WriteAsync(buffer); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     string error_message = ex.Message; 
     return false; 
    } 

    return true; 
} 

// New Delete Lines function based off your old one 
private string DeleteLines(string input_buffer, int id) 
{ 
    string output_buffer = ""; 

    using (StringReader sr = new StringReader(input_buffer)) 
    { 
     while (true) 
     { 
      string line = sr.ReadLine(); 
      if (line != null) 
      { 
       if (String.Compare(line, id.ToString()) == 0) 
       { 
       } 
       else 
       { 
        // add it to the output_buffer plus the newline 
        output_buffer += (line + "\n"); 
       } 
      } 
      else 
      { 
       break; 
      } 
     } 

    } 
    return output_buffer; 
} 

Если у вас есть проблемы с пониманием проблемы, это вообще хорошая идея, чтобы разбить его на более мелкие части и отлаживать оттуда ,

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