Как я могу получить последнее измененное значение удаленного файла?

Я хотел бы знать дату последнего изменения удаленного файла (определяемого через URL-адрес).
И загружать его только в том случае, если он новее, чем мой локально сохраненный файл.

Мне удалось сделать это для локальных файлов, но я не могу найти решение для удаленных файлов (без их загрузки)

работающий:

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)  

Я хотел бы иметь решение, которое будет загружать только заголовки файла


person Wurstbro    schedule 14.07.2014    source источник


Ответы (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.

person Mark    schedule 14.07.2014
comment
Можете ли вы придумать решение, которое не требует лазури? (установив его прямо сейчас, мы проверим ваше решение) - person Wurstbro; 15.07.2014
comment
@Wurstbro Я не знаю, почему для этого потребуется Azure - просто ссылка на System.Net.Http.dll, которая включена в .NET 4.5, или на пакет Microsoft.Net.Http NuGet, если он нацелен на .NET 4.0. Что вы видите, для чего требуется Azure — я думаю, что у меня установлен SDK, поэтому я мог ссылаться на что-то, не осознавая этого. - person Mark; 15.07.2014
comment
ну, System.Net.Http не существует в моей среде. У меня есть HttpListener и т. д., но нет пустого Http - person Wurstbro; 15.07.2014
comment
@Wurstbro На какую версию .NET вы ориентируетесь для своего проекта? - person Mark; 15.07.2014
comment
4.5.1 приложение Windows Forms - person Wurstbro; 15.07.2014
comment
@Wurstbro А вы добавили System.Net.Http.dll в ссылки на проект? - person Mark; 15.07.2014

Если сервер предлагает его, вы можете получить его через HTTP-заголовок Last -Измененное свойство. Но вы все еще застряли на загрузке полного файла.

Вы можете получить его через FTP.
Посмотрите, позволяет ли сервер вам видеть список файлов в папке.
Если веб-сайт где-то предлагает дату, которую вы можете извлечь из очистки экрана.

person the_lotus    schedule 14.07.2014
comment
Решение Марка лучше, но все равно спасибо - person Wurstbro; 16.07.2014

Я знаю, что это немного старый вопрос, но все же есть лучший ответ.

            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
person Roni Tovi    schedule 26.11.2014