【问题标题】:WebClient read the file dateWebClient 读取文件日期
【发布时间】:2013-10-04 07:17:00
【问题描述】:

我正在尝试制作一个启动器,用于下载一些游戏文件,如果它们的“最后修改日期”与您硬盘上已经存在的文件不同。

要在互联网上下载文件,您必须使用 WebClient.DownloadFile() 但我似乎找不到在线检查文件属性的方法,例如创建日期。

这实际上是存在的吗,还是我应该以另一种方式去做?

我应该提一下,我正在使用 C# 和 Windows 应用程序来构建启动器。

更新:我找到了解决方案,答案在下面。

【问题讨论】:

  • 在 HTTP 中,您通常使用 Last-Modified 标头。
  • 我会创建一个包含文件创建日期的额外文件。 MyOnlineFile.jpg.info
  • @Jeroen van Langen 这意味着每个文件都有一个额外的 HTTP 请求,带宽效率不高。也许是一个包含所有修改日期的唯一文件,但 Last-Modified 标题应该可以完成这项工作。
  • 我首先想到的是一个包含所有创建日期等的清单文件。
  • @Jeroen van Langen 是的,如果它对服务器端技术没有太多访问权限并且必须使用静态内容,我同意你的看法,如果 Last-Modified 标头是为此而设计的。

标签: c# winforms attributes webclient launcher


【解决方案1】:

通过大量研究和谷歌搜索,我刚刚找到了解决方案!

这是我想出的,它有效。我不知道这是否是最好的选择,但我想现在可以了。

HttpWebRequest gameFile = (HttpWebRequest)WebRequest.Create(ONLINEFILE_URL);
HttpWebResponse gameFileResponse = (HttpWebResponse)gameFile.GetResponse();

DateTime localFileModifiedTime = File.GetLastWriteTime(LOCALFILE_PATH);
DateTime onlineFileModifiedTime = gameFileResponse.LastModified;

if (localFileModifiedTime >= onlineFileModifiedTime) {
    //Play Game
} else {
    //Download new Update
}

【讨论】:

  • 我在我的 cmets 中就是这么说的!无论如何,想法是发送带有 If-Modified-Since 标头的请求,并设置您想要的日期(自我解释),如果文件没有更改,服务器将使用 304 Not Modified 响应。否则,它可能会返回带有文件内容的200 OK。我不知道上面是否会自动处理。
  • 上面肯定会自动完成。
  • 不,这看起来像您正在下载文件,将其修改时间与本地时间进行比较,如果已过期,请重新下载。正如已经指出的那样,您需要使用 If-Modified-Since 让 Web 服务器在 向您发送文件之前进行日期比较。
  • 是的,伙计,这会启动整个文件的下载,只是为了检查修改日期(你没有完成下载,但你也没有释放对象或关闭连接,所以你在后台浪费资源)。 -- 无论如何,除了其他人所说的之外,您可以保留当前的代码模式,并指定它使用“HEAD”动词而不是“GET”。 -- 你可以通过添加一行(在声明gameFileResponse 之前)来做到这一点,即gameFile.Method = "HEAD";。 (另外,你应该在完成后处理你的响应对象!!)
  • @BrainSlugs83 你晚了大约 5 年 ;) 但我很感激!
猜你喜欢
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多