0

私はここでは新しく、VB.NETは比較的新しいです。StreamWriterを正しく動作させることに特定の問題があります。私のプロジェクトの要件の1つは、ユーザーが[保存]ボタンをクリックしたときにファイルにデフォルトの名前を付けることです。これは、mysave.Filename="MyLog.log"を設定して行いました。ユーザーが指定したファイル名(mySave.Filename)に保存しようとしているストリームライターの新しいインスタンスを呼び出しますが、毎回、デフォルトのMyLog.logファイルに保存されます。以下にコードを貼り付けました。

ユーザーがファイル名に入力した値にデータが保存されていることを確認する方法を誰かに教えてもらえれば、それは非常に有益です。また、コード形式が完全に読めないことをお詫びしますが、4つのスペースインデントを活用する方法を学ぼうとしています。

ありがとう!

Imports System.IO
Public Class Form1
Dim Initial As String = "C:\Users\Brian Frick\Documents\Visual Studio 2010\Projects\HW5_Frick_Creator\HW5_Frick_Creator\bin\Debug" 'give variable for full path without log file
Dim Fullpath As String = "C:\Users\Brian Frick\Documents\Visual Studio 2010\Projects\HW5_Frick_Creator\HW5_Frick_Creator\bin\Debug\MyLog.log" 'give one path for full path
Dim filewriter As New StreamWriter(Fullpath, True)

Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click
    Application.Exit() ' quit application
    filewriter.Close()
End Sub

Private Sub SaveToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveToolStripMenuItem.Click
    Dim mySave As New SaveFileDialog
    mySave.Filter = "LOG File (*.log)|*.log" 'set filter to .log
    mySave.DefaultExt = "log" 'set default extension
    mySave.InitialDirectory = Initial 'set default directory
    mySave.FileName = "MyLog.log"
    mySave.OverwritePrompt = True ' make sure to ask user if they want to over write
    If mySave.ShowDialog() = DialogResult.OK Then
        Dim filewriter As New StreamWriter(mySave.FileName, True)

        filewriter.Close()

        'filewriter = New StreamWriter(mySave.FileName, True)
        'filewriter.Close() 'close filewriter to allow access to write directory
        'Dim Stream As New StreamWriter(mySave.FileName, True) 'save file to path chosen by user in SaveDialog
        'Stream.Close() ' Close stream to allow access to directory
        ' filewriter.Close()
    Else
        'dialog cancelled - no action
    End If
    filewriter.Close()
    filewriter = New StreamWriter(Fullpath, True) 're initiate filewriter to be used in successive iterations through the program without error
End Sub

Private Sub SavingsDepositBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SavingsDepositBtn.Click
    'write to file for SavDep
    filewriter.WriteLine("SavDep")
    filewriter.WriteLine(AccountBox.Text)
    filewriter.WriteLine(AmountBox.Text)
End Sub

Private Sub SavingsWithdrawBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SavingsWithdrawBtn.Click
    'write to file for SavWith
    filewriter.WriteLine("SavWith")
    filewriter.WriteLine(AccountBox.Text)
    filewriter.WriteLine(AmountBox.Text)
End Sub

Private Sub CheckDepsotBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckDepsotBtn.Click
    'write to file for CheckDep
    filewriter.WriteLine("CheckDep")
    filewriter.WriteLine(AccountBox.Text)
    filewriter.WriteLine(AmountBox.Text)
End Sub

Private Sub CheckWithdrawBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckWithdrawBtn.Click
    'write to file for CheckWith
    filewriter.WriteLine("CheckWith")
    filewriter.WriteLine(AccountBox.Text)
    filewriter.WriteLine(AmountBox.Text)
End Sub
End Class
4

1 に答える 1

0

ファイルライターを使用している一般的な方法は機能しません。また、スコープが重複する 2 つの「FileWriter」変数があるなど、他にも深刻な問題がいくつかあります。

保存ルーチンの場合、ファイルライターを再インスタンス化して別のパスを指すようにすることはできません。基になるストリームにあったすべてのデータが破棄されるため、何も節約できません。

プログラムの実行中にデータをメモリにキャッシュしてみてください。すべてのデータを一度にファイルに書き込む準備ができるまで、ストリームを作成しないでください。現在のアプローチでは、ログ ファイルへのハンドルのリークを防ぐことが非常に困難になっています。そのため、アプリがクラッシュした場合、ユーザーは再起動して書き込みロックを解除してから再度実行する必要があります。「using」構造と「Try ... 最後に」を調べます

于 2013-03-10T23:21:56.113 に答える