程序无法写入新制作的文本文件

时间:2013-03-18 22:26:25

标签: vb.net text-files streamwriter

在其他用户在这个问题中提出了一些很好的论点:How to write to a text file inside of the application后,我决定不使用资源文件,而是在文件夹中创建一个文件。然后从那里读/写。

虽然由于某种原因,我似乎无法写入有问题的文件,但它不断抛出异常,告诉我该文件已被其他进程使用。

这是我用来写这个文件的代码。

If System.IO.File.Exists(credentials) Then
                        Dim objWriter As New System.IO.StreamWriter(credentials, False)
                        objWriter.WriteLine(remember)
                        objWriter.Close()
                    Else
                        System.IO.Directory.CreateDirectory(Mid(My.Application.Info.DirectoryPath, 1, 1) & ":\ProgramData\DayZAdminPanel")
                        System.IO.File.Create(credentials)
                        Dim objWriter As New System.IO.StreamWriter(credentials, False)
                        objWriter.WriteLine(remember)
                        objWriter.Close()
                    End If

关于如何写入相关文本文件的任何想法?

3 个答案:

答案 0 :(得分:2)

您的应用程序的上一次迭代很可能无法正确关闭对StreamWriter中文件的访问。由于您的构造函数设置为覆盖(而不是追加)文件,因此可能是源。

尝试使用“使用”语句设置应用程序以正确打开/关闭文件:

If System.IO.File.Exists(credentials) Then

   Using objWriter As StreamWriter = New StreamWriter(credentials, False)
       objWriter.WriteLine(remember)
       objWriter.Close()
   End Using

Else             

   System.IO.Directory.CreateDirectory(Mid(My.Application.Info.DirectoryPath, 1, 1) & ":\ProgramData\DayZAdminPanel")
   System.IO.File.Create(credentials)

   Using objWriter As StreamWriter = New StreamWriter(credentials, False)
       objWriter.WriteLine(remember)
       objWriter.Close()
   End Using

End If

使用Using块和close语句看起来相当多余,但这确保即使发生异常也可以访问您的文件。

答案 1 :(得分:1)

您正在尝试在公共应用程序数据目录中创建目录。应使用Environment类方法和枚举找到此目录,因为操作系统之间存在差异。但是,您使用值credentials作为文件名。我想你想将你的数据文件存储在公共应用程序目录中,而不是存放在没有写入数据文件权限的地方(比如C:\ program files(x86))。

然后,为避免文件流未正确关闭的问题,请尝试使用Using statement来确保正确关闭和处理文件资源(无需在使用中调用close)。

另外,请注意StreamWriter完全能够创建文件(如果文件不存在)或者您希望覆盖以前的内容(为Append标志传递false)。
所以你的代码可以简化为这些代码。

' Get the common application data directory (could be different from Win7 and XP)
Dim workDir = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
' Combine with your own working data directory
workDir = Path.Combine(workdir, "DayZAdminPanel")
' Create if not exists
If Not Directory.Exists(workDir) Then
    Directory.CreateDirectory(workDir)
End If

' Create/Overwrite your data file in a subfolder of the common application data folder
Dim saveFile = Path.Combine(workDir, Path.GetFileName(credentials))
Using objWriter = New System.IO.StreamWriter(saveFile, False)
    objWriter.WriteLine(remember)
End Using

答案 2 :(得分:0)

File.Create返回一个打开的FileStream,你应该在后续传递给StreamWriter构造函数,而不是再次传递文件名,或者你可以省略File.Create完全打电话。

您可能希望查看Using的{​​{1}}块,以便可预测地关闭。