1

在其他用户在这个问题中提出了一些很好的论点之后:如何写入应用程序内部的文本文件,我决定不使用资源文件,而是在文件夹中创建一个文件,然后从那里读/写。

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

这是我用于写入此文件的代码。

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

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

4

3 回答 3

2

很有可能您的应用程序的先前迭代未能正确关闭对 StreamWriter 中文件的访问。由于您的构造函数设置为覆盖(而不是附加)到文件,这可能是源。

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

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 语句看起来确实是多余的,但这可以确保即使发生异常也可以访问您的文件。

于 2013-03-18T22:34:41.573 回答
1

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

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

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

' 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
于 2013-03-18T22:35:59.100 回答
0

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

您可能想要查看一个Using块,StreamWriter以便它可以预见地关闭。

于 2013-03-18T22:32:58.680 回答