2015-11-11 3 views
0

У меня есть код для загрузки файла, который только заменяет его.C# загрузка файла с помощью WebClient и сохранение его

WebClient webClient = new WebClient(); 
    { 
      webClient.DownloadFile("http://test.png", "C:\PNG.png") 
    } 

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

+4

Вы экономите его с тем же именем в том же месте, которое заменит это каждый раз. Просто используйте другое имя. –

+0

Перед тем, как скачать его, проверьте, существует ли он. Если он не загружает его. Если он делает что-то другое (используйте другое имя) – MarshallOfSound

+0

Мои извинения, я забыл об этом. –

ответ

2

Создавайте уникальное имя каждый раз.

WebClient webClient = new WebClient(); 
{ 
    webClient.DownloadFile("http://test.png", string.Format("C:\{0}.png", Guid.NewGuid().ToString())) 
} 
1

В то время как ответ Стивенса совершенно верен, это может быть иногда непрактично. Я предположил бы создать временное имя файла (что не так отличается от того, что предложил Стивен, но во временной папке, скорее всего, AppData/Local/Temp) и переименовать файл после завершения загрузки. Этот класс демонстрирует эту идею, и я не проверял, что он работает по назначению, но если он не хочет использовать сам класс.

class CopyDownloader 
{ 
    public string RemoteFileUrl { get; set; } 
    public string LocalFileName { get; set; } 
    WebClient webClient = new WebClient(); 

    public CopyDownloader() 
    { 
     webClient.DownloadFileCompleted += WebClientOnDownloadFileCompleted; 
    } 

    public void StartDownload() 
    { 
     var tempFileName = Path.GetTempFileName(); 
     webClient.DownloadFile(RemoteFileUrl, tempFileName, tempFileName) 
    } 

    private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEventArgs asyncCompletedEventArgs) 
    { 
     string tempFileName = asyncCompletedEventArgs.UserState as string; 
     File.Copy(tempFileName, GetUniqueFileName()); 
    } 

    private string GetUniqueFilename() 
    { 
     // Create an unused filename based on your original local filename or the remote filename 
    } 
} 

Если вы хотите, чтобы отобразить прогресс, которого вы могли бы выставить событие, которое испускается при WebClient.DownloadProgressChanged брошено

class CopyDownloader 
{ 
    public event DownloadProgressChangedEventHandler ProgressChanged; 

    private void WebClientOnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs downloadProgressChangedEventArgs) 
    { 
     if(ProgressChanged != null) 
     { 
      ProgressChanged(this, downloadProgressChangedEventArgs); 
     } 
    } 

    public CopyDownloader() 
    { 
     webClient.DownloadFileCompleted += WebClientOnDownloadFileCompleted; 
     webClient.DownloadProgressChanged += WebClientOnDownloadProgressChanged; 
    } 

    // ... 
}