使用StreamWriter时如何忽略Path中的非法字符?

时间:2013-11-17 19:32:56

标签: vb.net streamreader streamwriter argumentexception

底部的完整代码。

每当我尝试在我创建的程序中保存我的文本文件时,我就会收到ArgumentException:“路径中的非法字符”。

我的想法是它与目录路径有关(当提示使用输入框打开文件时,用户选择路径)。我在计算机上的路径是:

  

C:\用户\用户\桌面\ HighScoreEditor

我读过制表符可能是导致此异常的原因,所以我的想法可能是由目录路径中的“\”引起的。我是大学二年级学生,所以我可能完全错了。

我正在寻找的是如何忽略此异常,以便保存我的文件,或者解决方法,以便不会发生此异常。

我的文件是从输入框中用户输入的目录路径中读取的:

Dim message, title, defaultValue As String
Dim myValue As Object
Dim inFile As StreamReader
Dim strLine As String

' Set prompt.
message = "Enter a directory path to open your HighScore List."

' Set title.
title = "Which HighScore List should I open?"
defaultValue = ""   ' Set default value.

' Display message, title, and default value.
myValue = InputBox(message, title, defaultValue)

' If user has clicked Cancel. 
If myValue Is "" Then
    Exit Sub
End If

Try
    If File.Exists(myValue) = False Then
        MessageBox.Show("Error: File/Directory Path """ & myValue & """ does not exist.")
    ElseIf File.Exists(myValue) = True Then
        inFile = File.OpenText(myValue)

        Do While inFile.Peek <> -1
            strLine = inFile.ReadLine()
            txtScores.Text = txtScores.Text & vbCrLf & strLine
        Loop

        ' Close the file.
        inFile.Close()

    End If
Catch ex As Exception
    MessageBox.Show("Error: File/Directory Path """ & myValue & """ was found, however could not be opened." & vbCrLf & "" & vbCrLf & "Please make sure the list has a .txt file extension.")
End Try

以下是我的StreamWriter和保存按钮的代码:

Private Sub mnuFile_Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFile_Save.Click
        Dim outFile As StreamWriter

        outFile = File.CreateText(txtScores.Text)

        outFile.WriteLine(txtScores.Text)

        outFile.Close()

    End Sub

------以下完整代码------

Imports System.IO

Public Class frmHighScore_Editor

    Dim strTxt As String = "Click File > Open to display your HighScore List Here."

    Private Sub mnuFile_Exit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFile_Exit.Click
        ' Terminates the program.
        Me.Close()
    End Sub

    Private Sub mnuFile_Open_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFile_Open.Click
        Dim frmContinue As New frmContinue
        frmContinue.ShowDialog()

        Dim message, title, defaultValue As String
        Dim myValue As Object
        Dim inFile As StreamReader
        Dim strLine As String

        ' Set prompt.
        message = "Enter a directory path to open your HighScore List."

        ' Set title.
        title = "Which HighScore List should I open?"
        defaultValue = ""   ' Set default value.

        ' Display message, title, and default value.
        myValue = InputBox(message, title, defaultValue)

        ' If user has clicked Cancel. 
        If myValue Is "" Then
            Exit Sub
        End If

        txtScores.Text = String.Empty

        Try
            If File.Exists(myValue) = False Then
                txtScores.Text = strTxt
                MessageBox.Show("Error: File/Directory Path """ & myValue & """ does not exist.")

            ElseIf File.Exists(myValue) = True Then

                txtScores.Text = String.Empty

                If myValue.Contains("Blackjack.txt") Then
                    pbGame_Photo.Image = HighScores.My.Resources.Blackjack
                    lblGameName_Output.Text = "Blackjack"
                ElseIf myValue.Contains("Mahjong.txt") Then
                    pbGame_Photo.Image = HighScores.My.Resources.Mahjong
                    lblGameName_Output.Text = "Mahjong"
                ElseIf myValue.Contains("Minesweeper.txt") Then
                    pbGame_Photo.Image = HighScores.My.Resources.Minesweeper
                    lblGameName_Output.Text = "MineSweeper"
                ElseIf myValue.Contains("Pinball.txt") Then
                    pbGame_Photo.Image = HighScores.My.Resources.Pinball
                    lblGameName_Output.Text = "Pinball"
                ElseIf myValue.Contains("Solitaire.txt") Then
                    pbGame_Photo.Image = HighScores.My.Resources.Solitaire
                    lblGameName_Output.Text = "Solitaire"
                Else
                    pbGame_Photo.Image = HighScores.My.Resources.Blank
                    lblGameName_Output.Text = "Your Game"
                End If

                inFile = File.OpenText(myValue)

                Do While inFile.Peek <> -1
                    strLine = inFile.ReadLine()

                    Dim Res As String = ""
                    Dim Array(0) As Integer

                    For Each c As Char In strLine
                        If IsNumeric(c) Then
                            Res = Res & c

                            If CInt(Res) > Array(0) Then
                                Array(0) = CInt(Res)

                            End If

                        End If
                    Next
                    txtScores.Text = txtScores.Text & vbCrLf & strLine

                    lblScoreAchieved_Output.Text = Array(0)

                Loop

                ' Close the file.
                inFile.Close()

                txtScores.Enabled = True

                End If
        Catch ex As Exception
            txtScores.Text = strTxt
            MessageBox.Show("Error: File/Directory Path """ & myValue & """ was found, however could not be opened." & vbCrLf & "" & vbCrLf & "Please make sure the list has a .txt file extension.")
        End Try
    End Sub

    Private Sub frmHighScore_Editor_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Set the focus.
        gbGameInfo.Focus()

        pbGame_Photo.Image = HighScores.My.Resources.Blank

        ' Disable text box on load since it's empty anyways.
        txtScores.Enabled = False
        txtScores.Text = strTxt
    End Sub

    Private Sub mnuFile_Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFile_Save.Click
        Dim outFile As StreamWriter

        outFile = File.CreateText(txtScores.Text)

        outFile.WriteLine(txtScores.Text)

        outFile.Close()

    End Sub
End Class

------上面的完整代码------

1 个答案:

答案 0 :(得分:1)

  myValue = InputBox(message, title, defaultValue)

要求提供文件名是一种非常糟糕的方式。请改用SaveFileDialog。除了任何Windows用户都知道如何操作的直观对话框之外,它还会自动避免该异常。