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 を呼び出す必要はありません)。

また、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
于 2013-03-18T22:35:59.100 に答える
0

File.Createファイル名を再度渡すのではなく、後続FileStreamのコンストラクターに渡す必要がある open を返します。または、呼び出しを完全に省略することもできます。StreamWriterFile.Create

予想どおりに閉じられるように、 のUsingブロックを調べることができます。StreamWriter

于 2013-03-18T22:32:58.680 に答える