简体   繁体   English

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

[英]VB.Net - opening a file which may be local or remote (via http)

I wonder if someone can help me; 我想知道是否有人可以帮助我;

In PHP you can use fopen(Path) to read from a file. 在PHP中,您可以使用fopen(Path)从文件中读取。 The Path can be either a local file (in the usual formats /etc/file or c:\\file.txt) OR it can be a URL in which case PHP will open a http connection and read from the remote location Path可以是本地文件(通常格式为/ etc / file或c:\\ file.txt)也可以是URL,在这种情况下,PHP将打开http连接并从远程位置读取

I'd like to achieve the same in VB.Net. 我想在VB.Net中实现同样的目标。 I'm not aware of any framework function which will achieve this. 我不知道任何框架功能将实现这一目标。

I'm currently pattern matching the path against a Regex for a valid URL - If I get a match, I open the file using a httpwebrequest otherwise I try to use the local file system. 我目前正在针对有效URL匹配正则表达式的路径模式 - 如果我得到匹配,我使用httpwebrequest打开文件,否则我尝试使用本地文件系统。

This is all a little bit hacky - I'm hoping to find a better way to implement this. 这有点苛刻 - 我希望找到一种更好的方法来实现它。

Any advice or suggestions would be appreciated. 任何建议或意见将不胜感激。

        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: I'm aware that the logic above is inefficient and actually ends up calling IsURL() more than it has to - I'm intending to tidy it up if I can't find a more elegant solution. 注意:我知道上面的逻辑是低效的,实际上最终调用IsURL()比它更多 - 如果我找不到更优雅的解决方案,我打算整理它。

Thanks in advance for any help 在此先感谢您的帮助

I blieve you can use My.Computer.Network.DownloadFile It appears to do both. 我知道你可以使用My.Computer.Network.DownloadFile它似乎同时做到了。 It does not generate a stream but if you have a temporary directory to put the file then DownloadFile can do all the heavy listing and you could the open the temporary file from a known location. 它不会生成流,但如果您有一个临时目录来放置文件,那么DownloadFile可以执行所有繁重的列表,您可以从已知位置打开临时文件。 I ran this quick test to make sure and it worked from a URL and a file. 我运行了这个快速测试,以确保它可以从URL和文件中运行。

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

Let me know if this does not meet your needs in any way. 如果这不能满足您的需求,请告诉我。

Another Option: It looks like the base class webrequest will work for local and http files. 另一个选项:基类webrequest看起来像本地和http文件。 It was hiding under our nose the whole time. 它一直躲在我们的鼻子底下。 Let me know if this does not meet your needs in any way. 如果这不能满足您的需求,请告诉我。

    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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM