0

WebClient.DownloadFile()で問題が発生し、低速の接続で一貫してファイルが正しくダウンロードされません。正しくダウンロードしないということは、バイト単位のファイルのサイズが予想されるサイズと一致しないことを意味します。通常のイーサネット接続で正常にダウンロードされます。コードは次のとおりです。

internal void Start(List<FileInformation> fileList)
{
    filesCompleted = 0;
    totalNumberFiles = fileList.Count;

    using (webClient = new WebClient())
    {
        foreach (var file in fileList.OrderBy(x => x.Name))
        {
            if (file.Size > 0)
            {
                DownloadFile(file);
            }
            else
            {
                File.Create(AppStrings.FilebinPath + file.Name);
            }

            filesCompleted++;
            UpdateProgress(Convert.ToDouble(((filesCompleted / (double)totalNumberFiles) * 100).ToString("N2")));
        }
    }
}

private void DownloadFile(FileInformation file)
{
    var filePath = AppStrings.FilebinPath + file.Name;
    webClient.DownloadFile(new Uri(AppStrings.FilebinServer + file.Name), filePath);

    //Recursively retry the download until it downloads correctly.
    if ((new FileInfo(filePath).Length != file.Size))
    {
        //Added this debugging info to figure out what is going wrong.
        AppLog.WriteError("Failed to download file: " + filePath + "\nSize downloaded: " + new FileInfo(filePath).Length + "\nCorrect size: " + file.Size);
        DownloadFile(file);
    }
}

低速のネットワーク接続の場合、これを行うためのより信頼性の高い方法はありますか?

編集:質問はファイルを同期的にダウンロードすることに関するものであり、これを行うための最も信頼できる方法は何かを尋ねるので、これは重複ではありません。もう1つのトピックは、DownloadFilesAsyncがファイルを正しくダウンロードできない理由を尋ねることです。

編集2:次のコードを試して、最初のコメント@Davidで説明したのと同じ動作をしました:

byte[] data = null;
var webRequest = (HttpWebRequest)WebRequest.Create(new Uri(AppStrings.FilebinServer + file.Name));
webRequest.ProtocolVersion = Version.Parse("1.0");
using (var webResponse = (HttpWebResponse)webRequest.GetResponse())
{
    using (var streamReader = webResponse.GetResponseStream())
    {
        data = new byte[(int)webResponse.ContentLength];

        for (var i = 0; i < data.Length; i++)
        {
            data[i] = Convert.ToByte(streamReader.ReadByte());
        }
    }
}
4

0 に答える 0