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