如何获取远程文件的最后修改值?

时间:2014-07-14 18:21:22

标签: vb.net url last-modified

我想知道远程文件的最后修改日期(通过网址定义)。
只有下载它,如果它比我本地存储的更新。

我设法为本地文件执行此操作,但找不到为远程文件执行此操作的解决方案(无需下载)

工作:

Dim infoReader As System.IO.FileInfo = My.Computer.FileSystem.GetFileInfo("C:/test.txt")
MsgBox("File was last modified on " & infoReader.LastWriteTime)  

不工作:

        Dim infoReader As System.IO.FileInfo = My.Computer.FileSystem.GetFileInfo("http://google.com/robots.txt")
        MsgBox("File was last modified on " & infoReader.LastWriteTime)  

我希望有一个只需要下载文件标题的解决方案

3 个答案:

答案 0 :(得分:3)

您可以使用System.Net.Http.HttpClient类从服务器获取上次修改日期。由于它发送HEAD请求,因此无法获取文件内容:

Dim client = New HttpClient()
Dim msg = New HttpRequestMessage(HttpMethod.Head, "http://google.com/robots.txt")
Dim resp = client.SendAsync(msg).Result
Dim lastMod = resp.Content.Headers.LastModified

您还可以将If-Modified-Since请求标头与GET请求一起使用。这样,如果文件尚未更改(未发送文件内容),则响应应为304 - Not Modified;如果文件已更改,则响应应为200 - OK(并且响应中将发送文件内容),虽然服务器不需要遵守此标题。

Dim client = New HttpClient()
Dim msg = New HttpRequestMessage(HttpMethod.Get, "http://google.com/robots.txt")
msg.Headers.IfModifiedSince = DateTimeOffset.UtcNow.AddDays(-1) ' use the date of your copy of the file
Dim resp = client.SendAsync(msg).Result
Select Case resp.StatusCode
    Case HttpStatusCode.NotModified
        ' Your copy is up-to-date
    Case HttpStatusCode.OK
        ' Your copy is out of date, so save it
        File.WriteAllBytes("C:\robots.txt", resp.Content.ReadAsByteArrayAsync.Result)
End Select

请注意使用.Result,因为我在控制台应用程序中进行测试 - 您应该await代替。

答案 1 :(得分:1)

如果服务器提供,您可以通过HTTP header Last-Modified property获取它。但你仍然坚持下载完整的文件。

你可以通过FTP获得它 查看服务器是否允许您查看文件夹中的文件列表 如果网站提供的日期可以通过屏幕报废。

答案 2 :(得分:1)

我知道这是一个有点老问题但是,还有更好的答案。

            Dim req As WebRequest = HttpWebRequest.Create("someurl")
            req.Method = "HEAD"
            Dim resp As WebResponse = req.GetResponse()
            Dim remoteFileLastModified As String = resp.Headers.Get("Last-Modified")
            Dim remoteFileLastModifiedDateTime As DateTime
            If DateTime.TryParse(remoteFileLastModified, remoteFileLastModifiedDateTime) Then
                MsgBox("Date Last Modified:" + remoteFileLastModifiedDateTime.ToString("d MMMM yyyy dddd HH:mm:ss"))
            Else
                MsgBox("could not determine")
            End If