VB.Net - 打开一个本地或远程文件(通过http)

时间:2010-02-20 16:39:52

标签: .net vb.net fopen

我想知道是否有人可以帮助我;

在PHP中,您可以使用fopen(Path)从文件中读取。 Path 可以是本地文件(通常格式为/ etc / file或c:\ file.txt)或者它可以是一个URL,在这种情况下PHP将打开一个http连接并从中读取远程位置

我想在VB.Net中实现同样的目标。我不知道任何可以实现这一目标的框架功能。

我目前正在将路径与正则表达式匹配为有效的URL - 如果我得到匹配,我使用httpwebrequest打开文件,否则我尝试使用本地文件系统。

这一点都很简陋 - 我希望找到更好的方法来实现它。

任何意见或建议都将不胜感激。

        Private Function RetrieveBGImage() As Image
        Dim Ret As Image
        If Not (IsURL(_BackgroundImage) Or IsLocalFile(_BackgroundImage)) Then
            Throw New Exception(String.Format("Unable to load from uri ""{0}""", _BackgroundImage))
        End If
        If IsURL(_BackgroundImage) Then
            Dim Response As Net.HttpWebResponse = Nothing
            Try
                Dim Request As Net.HttpWebRequest = DirectCast(Net.HttpWebRequest.Create(_BackgroundImage), Net.HttpWebRequest)
                Response = DirectCast(Request.GetResponse, Net.HttpWebResponse)
                Ret = Image.FromStream(Response.GetResponseStream())
            Catch ex As Exception
                Throw New Exception(String.Format("Unable to load uri: ""{0}"" using HTTPWebRequest. {1}", _BackgroundImage, ex.Message), ex)
            Finally
                If Response IsNot Nothing Then
                    Response.Close()
                End If
                Response = Nothing
            End Try
        Else
            Try
                Ret = Image.FromFile(_BackgroundImage)
            Catch ex As Exception
                Throw New Exception(String.Format("Unable to load uri ""{0}"" using local file system. {1}", _BackgroundImage, ex.Message), ex)
            End Try
        End If
        Return Ret
    End Function

    Private Function IsURL(ByVal Path As String) As Boolean
        Dim RegexObj As New Regex("^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w\d{1-3}]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|edu|co\.uk|ac\.uk|it|fr|tv|museum|asia|local|travel|[a-z]{2})?)(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$")
        Dim MatchObj As Match = RegexObj.Match(Path)
        Return MatchObj.Success
    End Function

    Private Function IsLocalFile(ByVal Path As String) As Boolean
        Dim Ret As Boolean = False
        Try
            Dim FInfo As New FileInfo(_BackgroundImage)
            Ret = FInfo.Exists

        Catch handledex As ArgumentException
            'Ignore invalid path errors
        Catch ex As Exception
            Throw New Exception(String.Format("Unable to load uri ""{0}"" using local file system. {1}", Path, ex.Message), ex)
        End Try
        Return Ret
    End Function

NB:我知道上面的逻辑是低效的,实际上最终会调用IsURL()而不是它 - 如果我找不到的话,我打算把它整理一下一个更优雅的解决方案。

提前感谢您提供任何帮助

2 个答案:

答案 0 :(得分:2)

我知道你可以使用My.Computer.Network.DownloadFile它似乎同时做到了。它不会生成流,但如果您有一个临时目录来放置文件,那么DownloadFile可以执行所有繁重的列表,您可以从已知位置打开临时文件。我运行了这个快速测试,以确保它可以从URL和文件中运行。

    My.Computer.Network.DownloadFile("c:/test1.txt", "C:/test2.txt")
    My.Computer.Network.DownloadFile("http://google.com", "C:/test3.txt")

如果这不能满足您的需求,请告诉我。

答案 1 :(得分:2)

另一种选择: 看起来基类webrequest将适用于本地和http文件。它一直躲在我们的鼻子底下。如果这不能满足您的需求,请告诉我。

    Private Function RetrieveBGImage() As Image
    Dim Ret As Image

    Dim Response As Net.WebResponse = Nothing
    Try
        Dim Request As Net.WebRequest = Net.WebRequest.Create(_BackgroundImage)
        Response = Request.GetResponse
        Ret = Image.FromStream(Response.GetResponseStream())
    Catch ex As Exception
        Throw New Exception(String.Format("Unable to load file", _BackgroundImage, ex.Message), ex)
    Finally
        If Response IsNot Nothing Then
            Response.Close()
        End If
        Response = Nothing
    End Try

    Return Ret
End Function