1

誰か助けてくれませんか?

PHP では、 fopen(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

注意:上記のロジックは非効率的であり、実際には必要以上に IsURL() を呼び出すことになることは承知しています。より洗練されたソリューションが見つからない場合は、整理するつもりです。

助けてくれてありがとう

4

2 に答える 2

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
于 2010-02-21T15:02:38.990 に答える
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")

これが何らかの形でお客様のニーズを満たさない場合はお知らせください。

于 2010-02-20T20:16:35.290 に答える