WebClient.DownloadFileAsync在磁盘上已存在的情况下会覆盖文件吗?

11

我找不到与我的问题相关的任何信息。如果我的搜索努力没有足够好,以至于找不到答案,请原谅我。我只是想避免白费力气。

谢谢!

跟进:如果它没有覆盖,我该如何让它覆盖(如果可能的话)?


似乎很简单,只需尝试并找出答案。如果没有,下载前检查是否有同名文件,并在下载前删除它。 - Servy
1
如果你问我(你确实问了!),这似乎是一个适合用谷歌解决的好问题;] - plast1K
3个回答

44

一个30秒的测试确认它确实进行了覆盖

测试:

using (WebClient client = new WebClient())
{
    client.DownloadFileAsync(new Uri("http://download.microsoft.com/download/8/4/A/84A35BF1-DAFE-4AE8-82AF-AD2AE20B6B14/directx_Jun2010_redist.exe"), @"C:\Test.exe");
}

如果重新下载,Test.exe 将被覆盖。


28
谢谢,我刚刚节省了28秒时间。 :-) - thomas nn

3
WebClient 类显然旨在抑制大量的细节和控制。您可以编写自己的方法轻松异步下载文件并控制下载数据如何写入磁盘。
我确定这个解决方案中的 codeproject 包含一个使用 WebRequestWebResponse 下载文件的类,允许更多控制。请参见包含的名为 webdata 的类。您需要注意的代码如下:
FileStream newFile = new FileStream(targetFolder + file, FileMode.Create);
newFile.Write(downloadedData, 0, downloadedData.Length);
newFile.Close();

FileMode 枚举 包含一系列成员,用于控制保存文件的行为。如果文件已经存在,则 FileMode.CreateNew 会抛出 IOException。而 FileMode.Create 则会在可能的情况下覆盖现有文件。

如果您坚持使用 WebClient.DownloadFileAsync,那么正如其他人已经提到的那样:您可以通过 OpenFileDialog 向用户说明将覆盖现有文件,但某些下载可能需要耗费时间,而且无法保证用户在下载过程中没有创建另一个文件。


1
如果文件存在,是的。
如果您正在重命名它,或者将其挂钩到一个OpenFileDialogue()中,那就由您自行决定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接