2017-02-21 7 views
0

Я получаю эту ошибку, когда я пишу в файл и заменить строки, содержащиеся в файле, и я не имею ни малейшего представления, как ее решить:Я использую StreamReader неэффективно? - «System.IO.IOException» произошло в mscorlib.dll

Процесс не может получить доступ к файлу «C: \ WarThunder \ config.blk», потому что он используется другим процессом.

Я попытался закрыть все, что у меня есть, которые могут размещать данные этих файлов, но у меня есть ощущение, что это, вероятно, мое неэффективное использование кода, вызывающего это. Раньше это не было проблемой. Я не помню, когда это всплыло:/

Следующий код повторяется один раз каждый для двух других флажков:

private void rdbDX11_CheckedChanged(object sender, EventArgs e) 
    { 
     if (rdbDX11.Checked == true) 
     { 
      pbOGL3Outer.Visible = false; 
      pdDX11Outer.Visible = true; 
      pdDX9Outer.Visible = false; 
      rdbDX9.Checked = false; 
      rdbOGL3.Checked = false; 
      Properties.Settings.Default.varRenderSelected = ("DirectX11"); 

      using (StreamReader ReadConfig = new StreamReader(Properties.Settings.Default.SavedConfig)) 
      { 
       while (ReadConfig.Peek() != 1)        //While not end of file 
       { 
        var ReWriteFile = File.ReadAllText(Properties.Settings.Default.SavedConfig); 

        if (ReWriteFile.Contains(" driver:t=\"dx9\"")) 
        { ReWriteFile = ReWriteFile.Replace(" driver:t=\"dx9\"", " driver:t=\"dx11\""); } 

        else if (ReWriteFile.Contains(" driver:t=\"gl3\"")) 
        { ReWriteFile = ReWriteFile.Replace(" driver:t=\"gl3\"", " driver:t=\"dx11\""); } 

        else if (ReWriteFile.Contains(" driver:t=\"auto\"")) 
        { ReWriteFile = ReWriteFile.Replace(" driver:t=\"auto\"", " driver:t=\"dx11\""); } 

        System.IO.File.WriteAllText(Properties.Settings.Default.SavedConfig, ReWriteFile); 
       } 
      } 
     } 

    } 
+1

Читать весь текст 'var ReWriteFile = File.Re adAllText' отредактируйте его, затем напишите: 'File.WriteAllText (...'. Не используйте 'StreamReader' вообще –

+0

Спасибо! Починил это :) – Lewis

ответ

3

Все, что вам нужно сделать, это

  1. Прочитайте текст из файла
  2. Редактировать текст
  3. записать его обратно в файл

что-то вроде этого:

private void rdbDX11_CheckedChanged(object sender, EventArgs e) 
{ 
    if (rdbDX11.Checked == true) 
    { 
     pbOGL3Outer.Visible = false; 
     pdDX11Outer.Visible = true; 
     pdDX9Outer.Visible = false; 
     rdbDX9.Checked = false; 
     rdbOGL3.Checked = false; 
     Properties.Settings.Default.varRenderSelected = ("DirectX11"); 

     // Read 
     var ReWriteFile = File.ReadAllText(Properties.Settings.Default.SavedConfig); 

     // Edit 
     ReWriteFile = ReWriteFile 
      .Replace(" driver:t=\"dx9\"", " driver:t=\"dx11\"") 
      .Replace(" driver:t=\"gl3\"", " driver:t=\"dx11\"") 
      .Replace(" driver:t=\"auto\"", " driver:t=\"dx11\""); 

     // Write back 
     File.WriteAllText(Properties.Settings.Default.SavedConfig, ReWriteFile); 
    } 
} 
2

Эта линия:

System.IO.File.WriteAllText(Properties.Settings.Default.SavedConfig, ReWriteFile); 

не в состоянии написать к Properties.Settings.Default.SavedConfig потому что у вас есть открытые StreamWriter в тот же файл, который вы открываете в вашем using заявлении:

using (StreamReader ReadConfig = new StreamReader(Properties.Settings.Default.SavedConfig)) 

Нет причин даже создавать это StreamReader или использовать петлю while. Вы здесь полный текст файла с этой строкой:

var ReWriteFile = File.ReadAllText(Properties.Settings.Default.SavedConfig); 

Потерять using блок; потерять петлю while. Все лучше.

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