0

アップロードされた txt ファイルを解析しようとしています。解析中にエラーが発生した場合は、ファイルを保存する必要があります。問題は、パーサーがストリーム リーダーを使用していて、エラーが発生した場合、ファイルの内容ではなく空のファイルを保存することです。

Dim file As HttpPostedFile = context.Request.Files(0)
    If Not IsNothing(file) AndAlso file.ContentLength > 0 AndAlso Path.GetExtension(file.FileName) = ".txt" Then
        Dim id As Integer = (Int32.Parse(context.Request("id")))

        Try
            ParseFile(file, id)
            context.Response.Write("success")
        Catch ex As Exception
            Dim filename As String = file.FileName
            Dim uploadPath = context.Server.MapPath("~/Errors/MyStudentDataFiles/")
            file.SaveAs(uploadPath + id.ToString() + filename)
        End Try
     Else
            context.Response.Write("error")
    End If

私の ParseFile メソッドは次のようなものです

Protected Sub ParseFile(ByVal studentLoanfile As HttpPostedFile, ByVal id As Integer)
Using r As New StreamReader(studentLoanfile.InputStream)
        line = GetLine(r)
End Using
End Sub

parseFile サブに渡される前にファイルを複製する方法、または内容を失うことなくファイルを読み取る方法はありますか? 前もって感謝します

4

1 に答える 1

0

将来この問題に遭遇する人のために、ファイルを最後まで読み込んで変数に保存することになりました。次に、パーサーに使用するメモリ ストリームに変換し直しました。エラーが発生した場合は、文字列を含む新しいファイルを作成するだけです。これは私が使用したコードです。

Dim id As Integer = (Int32.Parse(context.Request("id")))

        'Read full file for error logging
        Dim content As String = [String].Empty
        Using sr = New StreamReader(uploadedFile.InputStream)
            content = sr.ReadToEnd()
        End Using
        'Convert it back into a stream
        Dim byteArray As Byte() = Encoding.UTF8.GetBytes(content)
        Dim stream As New MemoryStream(byteArray)

        Try
            ParseFile(stream, id, content)
            context.Response.Write("success")
        Catch ex As Exception
            Dim filename As String = uploadedFile.FileName
            Dim uploadPath = context.Server.MapPath("~/Errors/MyStudentDataFiles/")
            'Save full file on error
            Using sw As StreamWriter = File.CreateText(uploadPath + id.ToString() + filename)
                sw.WriteLine(content)
            End Using
            context.Response.Write("error")
            Throw ex
        End Try
    Else
        context.Response.Write("error")
    End If
于 2013-05-17T20:41:54.677 に答える