Vb.net 检查文件是否在线的最快捷和最简单的方法是什么?

Vb.net 检查文件是否在线的最快捷和最简单的方法是什么?,vb.net,Vb.net,检查文件是否在线的最快捷和最简单的方法是什么 我知道如何检查文件系统或网站上是否存在文件,但我不知道如何检查文件是否在线。我该怎么做 我想验证是否在线存在以下链接: 您在线检查的方式与检查文件系统的方式相同:尝试访问该文件,如果尝试失败,则处理异常(顺便说一句:如果您在文件系统上使用file.Exists(),则可能是错误的) 唯一的额外问题是,在联机检查时,您可以发送资源的http请求并访问响应流,而无需实际读取流,这意味着您不必下载整个文件就知道请求将完成。对于http,请使用http HE

检查文件是否在线的最快捷和最简单的方法是什么

我知道如何检查文件系统或网站上是否存在文件,但我不知道如何检查文件是否在线。我该怎么做

我想验证是否在线存在以下链接:


您在线检查的方式与检查文件系统的方式相同:尝试访问该文件,如果尝试失败,则处理异常(顺便说一句:如果您在文件系统上使用file.Exists(),则可能是错误的)


唯一的额外问题是,在联机检查时,您可以发送资源的http请求并访问响应流,而无需实际读取流,这意味着您不必下载整个文件就知道请求将完成。

对于http,请使用http HEAD方法。它的行为类似于GET方法,只是它只返回内容头。如果文件不存在,服务器应返回404状态代码。否则,您可以假定该文件存在(甚至可以从内容头获取其大小)

编辑

您可以使用以下代码:

Public Function ResourceExists(location As Uri) As Boolean
    If (Not String.Equals(location.Scheme, Uri.UriSchemeHttp, StringComparison.InvariantCultureIgnoreCase)) And (Not String.Equals(location.Scheme, Uri.UriSchemeHttps, StringComparison.InvariantCultureIgnoreCase)) Then
        Throw New NotSupportedException("URI scheme is not supported")
    End If

    Dim request = Net.WebRequest.Create(location)
    request.Method = "HEAD"

    Try
        Using response = request.GetResponse
            Return DirectCast(response, Net.HttpWebResponse).StatusCode = Net.HttpStatusCode.OK
        End Using
    Catch ex As Net.WebException
        Select Case DirectCast(ex.Response, Net.HttpWebResponse).StatusCode
            Case Net.HttpStatusCode.NotFound
                Return False
            Case Else
                Throw
        End Select
    End Try
End Function
用法:

Dim itExists As Boolean = ResourceExists(New Uri("http://ccc-itgs2012.wikispaces.com/file/view/AP+Human+Geography+Gapminder.flv"))
这会锁定调用者的线程,因此您可能希望将其重构为异步方法。

这段代码适合我

Public Function CheckAddress(ByVal URL As String) As Boolean
    Try
        Dim request As WebRequest = WebRequest.Create(URL)
        Dim response As WebResponse = request.GetResponse()
    Catch ex As Exception
        Return False
    End Try
    Return True
End Function

我想到的最好的方法,实际上是发现它可以正常工作,因为所有的方法都只是检查是否找到了域,所以如果找到了域而没有找到文件,它仍然会告诉你找到了文件,我的方法是尝试使用下载文件异步运行计时器3秒钟,3秒钟后检查是否有字节从该文件下载,如果有,则通过该链接可以找到该文件,如果没有,则找不到,然后,您可以取消下载并删除在PC上创建的文件

以下是我的代码:

Imports System.IO
Imports System.Net
Public Class Form1
    Dim BytesReceived As Integer

    Public WithEvents Download As WebClient

    Private Sub DownloadBUT_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Download = New WebClient
        Download.DownloadFileAsync(New Uri("http://example.com/FileName.exe"), My.Computer.FileSystem.SpecialDirectories.Desktop & "FileName.exe")
        CheckFileTimer.Start()
        DownloadBUT.Enabled = False
    End Sub

    Private Sub Download_DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) Handles Download.DownloadProgressChanged
        BytesReceived = e.BytesReceived
    End Sub

    Private Sub CheckFileTimer_Tick(sender As Object, e As EventArgs) Handles CheckFileTimer.Tick
        CheckFileTimer.Stop()
        If BytesReceived = 0 Then
            MsgBox("File not found!")
        Else
            MsgBox("File found!")
        End If
        DownloadBUT.Enabled = True
        Download.CancelAsync()
        Try
            File.Delete(My.Computer.FileSystem.SpecialDirectories.Desktop & "FileName.exe")
        Catch ex As Exception : End Try
    End Sub
End Class

希望这对你有用:)

听起来很棒。你能给我举个例子吗。就像我尝试过的那样,我永远也做不到work@Santa检查这个:也感谢Joel指出文件。存在的东西,我不知道这一点。虽然代码工作。执行需要很长时间(8-15秒)有没有更快的方法?正如joel所描述的那样,它似乎非常快。您只需要更改方法以返回响应对象。如果您看到的是布尔真/假,那么您就做错了。不幸的是,检查易失性资源的唯一好方法是使用它们并处理异常。你能给我举个例子吗?这个方法听起来确实不错,我在答案中添加了一个用法示例。请注意,它只捕获错误404(未找到)。如果服务器返回不同的错误代码,此方法将重新抛出它。