[英]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.