Запись в файл, файл используется другим процессом

Итак, я не могу понять, почему я не могу писать в файл. Он говорит, что он используется другим процессом. Вот ошибка (IOException не было обработано):

The process cannot access the file 'C:\Temp\TempFile.cfg' because it is being used by another process.

Вот текущий код, который я использую для записи в файл:

Dim myConfig
    Dim saveFileDialog1 As New SaveFileDialog()

    saveFileDialog1.Filter = "Configuration Files (*.cfg)|*.cfg"
    saveFileDialog1.FilterIndex = 2
    saveFileDialog1.RestoreDirectory = True

    If saveFileDialog1.ShowDialog() = DialogResult.OK Then
        myConfig = saveFileDialog1.OpenFile()
        If (myConfig IsNot Nothing) Then
            System.IO.File.WriteAllText(saveFileDialog1.FileName, TextBox1_Output_Module.Text & vbCrLf & TextBox2_Output_Module.Text & vbCrLf & TextBox3_Output_Module.Text)
            myConfig.Close()
        End If
    End If

Я не уверен, что мне не хватает, поскольку я думал, что проверил это вчера, и это сработало.


person Muhnamana    schedule 09.05.2012    source источник
comment
Вот чего я не знаю. Я пытаюсь записать в файл, который еще не был создан, поэтому я не перезаписываю уже существующий файл, который может быть открыт в другой программе, например в Блокноте или чем-то еще.   -  person Muhnamana    schedule 09.05.2012


Ответы (2)


Я предполагаю, что процесс, который держит файл открытым, является вашим собственным процессом.
Когда вы вызываете saveDialog1.OpenFile(), вы открываете файл, и возвращается поток.
Затем вы вызываете WriteAllText(), который пытается снова откройте тот же файл, что приведет к исключению выше.
Вы можете решить, просто удалив вызов OpenFile()

   If saveFileDialog1.ShowDialog() = DialogResult.OK Then 
       File.WriteAllText(saveFileDialog1.FileName, TextBox1_Output_Module.Text & vbCrLf & TextBox2_Output_Module.Text & vbCrLf & TextBox3_Output_Module.Text) 
   End If 

Просто имейте в виду, что WriteAllText() создает новый файл, записывает указанную строку в файл, а затем закрывает файл. Если целевой файл уже существует, он перезаписывается.

person Steve    schedule 09.05.2012

Ну вот что я в итоге сделал, кажется, работает нормально, как есть. Я убрал условие if и оставил все как есть. Я всегда могу закодировать отмену позже.

    Dim myConfig
    Dim saveFileDialog1 As New SaveFileDialog()

    saveFileDialog1.Filter = "Configuration Files (*.cfg)|*.cfg"
    saveFileDialog1.FilterIndex = 2
    saveFileDialog1.RestoreDirectory = True

    System.IO.File.WriteAllText(saveFileDialog1.FileName, TextBox1_Output_Module.Text & vbCrLf & TextBox2_Output_Module.Text & vbCrLf & TextBox3_Output_Module.Text)

Это коды для кнопки ok/cancel.

    If saveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
        System.IO.File.WriteAllText(saveFileDialog1.FileName, TextBox1_Output_Module.Text & vbCrLf & TextBox2_Output_Module.Text & vbCrLf & TextBox3_Output_Module.Text)
    End If
person Muhnamana    schedule 09.05.2012
comment
Что произойдет, если пользователь нажмет «Отмена» в диалоговом окне «Сохранить»? - person Steve; 10.05.2012