2015-12-01 3 views
0

Я реализую кнопку Сохранить файл в приложении VB.NET Windows Forms.Почему File.Open() не открывает файл?

Я пытаюсь инкапсулировать нормально ожидаемое поведение кнопок «Сохранить» в приложениях Windows. I.E: Если файл уже был выбран, откройте текущий файл, напишите ему и сохраните его; else, если нет текущего файла, или Сохранить как было использовано, тогда покажите SaveFileDialog, затем откройте, напишите и сохраните все то же самое.

В настоящее время я закодированы функции ниже, но я получаю исключение:

не удается получить доступ к закрытому файлу

Файл создается просто отлично, но пустое (Он должен содержать "Test string"). Я не могу понять, как файл закрыт, если какая-то сборка мусора не сработает с ним каким-то образом ??

Текущий код:

Function SaveFile(ByVal Type As ProfileType, ByVal suggestedFileName As String, ByVal saveAs As Boolean, ByVal writeData As String) As Boolean 
    Dim FileStream As Stream = Nothing 
    Dim FolderPath As String = Nothing 
    Dim CancelSave As Boolean = False 
    Dim SaveFileDialog As SaveFileDialog = New SaveFileDialog() 

    Try 
     If Type = ProfileType.Product Then 'Select the initial directory path 
      FolderPath = ProductPath 
     Else 
      FolderPath = ProfilePath 
     End If 

     If (FileName = String.Empty Or saveAs = True) Then 'If a file is not already selected launch a dialog to allow the user to select one 
      With SaveFileDialog 
       .Title = "Save" 
       .AddExtension = True 
       .CheckPathExists = True 
       .CreatePrompt = False 
       .DefaultExt = "xml" 
       .Filter = "Xml Files (*.xml)|*.xml" 
       .FilterIndex = 0 
       .FileName = suggestedFileName 
       .InitialDirectory = FolderPath 
       If .ShowDialog(Me) = Windows.Forms.DialogResult.OK Then 
        FullyQualfiedPathName = New String(SaveFileDialog.FileName) 'Save the path and name of the file 
        FileName = Path.GetFileName(FullyQualfiedPathName) 
       Else 
        CancelSave = True 
       End If 
       .Dispose() 
      End With 
     End If 

     If (FileName <> String.Empty) Then 'Write the string to the file if the filewas correctly selected 
      FileStream = File.Open(FullyQualfiedPathName, FileMode.OpenOrCreate, FileAccess.ReadWrite) 'Open the file 
      Using FileStreamWriter As New StreamWriter(FileStream) 'Create the stream writer 
       FileStreamWriter.Write(writeData) 'Write the data 
       FileStream.Close() 'Clse the file 
      End Using 
     ElseIf (CancelSave <> True) Then 'Only throw an exception if the user *didn't* cancel the SavefileDialog 
      Throw New Exception("File stream was nothing", New IOException()) 
     End If 

    Catch ex As Exception 
     MessageBox.Show(ex.Message & Environment.NewLine & FullyQualfiedPathName) 
    End Try 
    Return True 
End Function 
+2

Сначала вы должны закрыть FileStreamWriter, а затем FileStream. А не наоборот. –

+3

Существует [File.WriteAllText Method] (https://msdn.microsoft.com/en-us/library/ms143375%28v=vs.110%29.aspx), который вы можете использовать для эффективной замены FileStream/FileStreamWriter кода, с бонусом, что он заменяет текущий файл, а не разделяет данные в начале его. –

ответ

2

Одна проблема, которую я вижу, что вы должны положить ваши File.Open в Using блоке:

Using fs = File.Open(fullyQualfiedPathName, FileMode.OpenOrCreate, FileAccess.ReadWrite) 
    Using writer As New StreamWriter(fs) 'Create the stream writer 
     writer.Write(writeData) 'Write the data 
     'fs.Close() <--- you do not need this line becuase the "Using" block will take care of this for you. 
    End Using 
End Using 

Я не уверен, если это решит проблему потому что я не могу запустить ваш код, но блок Using автоматически позаботится о закрытии и очистке одноразовых экземпляров, таких как FileStream и StreamWriter, даже если выбрано исключение.

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

+0

Спасибо за информацию. Добавили использование, но это не решило проблему. Я думал, что помню, как MSDN сообщила мне, что почти все переменные, кроме имен параметров, должны быть в верхней части верблюда ??? Я посмотрю, смогу ли найти ссылку – Toby

+0

. Здесь вы найдете: https://msdn.microsoft.com/en-us/library/ms229045%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 –

+1

И это: https://msdn.microsoft.com/en-us/library/ms229043%28v=vs.110%29.aspx –

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