C # Как получить размер файла загрузки для отображения процента выполнения - PullRequest
2 голосов
/ 13 марта 2012

Я использую ProgressBar в C #, но у меня возникла небольшая проблема, я подключаюсь к серверу в нашей компании, а затем я начинаю скачивать XML-файл с этих 4K на 4K и отображать этот прогресс на ProgressBar идля показа этого, если файл до 100K до сих пор, тогда максимальный размер моего индикатора прогресса будет 100, и если он изменится, я бы изменил его максимальный размер на 1000, затем 10000 и т. д., таким образом, я могу сделать это

progressbar1.value += 4;

Так что это как-то работает, но все, что вы знаете, правильное решение - это знать размер файла, который будет загружать мое соединение, прежде чем начать загружать его.Я думаю немного, и я думаю, что использование Curl может решить проблему, но я не знаю точно, как использовать его в C # или в любом случае, чтобы решить эту проблему.

Редактировать: я загружаю файлкак это:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Credentials = new NetworkCredential(usr, pass);
            ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader s = new StreamReader(response.GetResponseStream());
            int i = 0;
            int j = 0;
            int lastIndex = 0;
            int readNum = 0;
            Console.WriteLine("start at : " + DateTime.Now);
            while (!s.EndOfStream)
            {
                readNum = s.ReadBlock(temp, 0, 4096);
                if (w != null)
                    w.incByVolume(4);
                ret += new String(temp);
                temp = new char[4096];
            }

Заранее спасибо ...

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Если вы загрузите его по HTTP (S), вы можете использовать WebClient.DownloadFileAsync, в котором есть все, что вам нужно:

WebClient webClient = new WebClient();
webClient.DownloadProgressChanged += (s, args) =>
{
    //args.BytesReceived, args.TotalBytesToReceive and args.ProgressPercentage will have all you need
};
webClient.DownloadFileCompleted += (s, args) =>
{
    //done
};
webClient.DownloadFileAsync(new Uri(remoteFile), localFile);
// or the following if you want it in memory:
webClient.DownloadStringCompleted += (s, args) => 
{
    //done, see args.Result for the string
};
webClient.DownloadStringAsync(new Uri(remoteFile));

Если вам нужны учетные данные для доступа к странице, вы можете использовать свойство Credentials WebClient.

Согласно примечаниям по WebClient:

По умолчанию .NET Framework поддерживает идентификаторы URI, начинающиеся с идентификаторов схемы http :, https:, ftp: и file:.

Таким образом, он будет работать даже с загрузкой файла из общего ресурса с использованием идентификатора file:.

0 голосов
/ 13 марта 2012

Чтобы узнать длину (размер) файла перед загрузкой, вы должны прочитать заголовок Content-Length в HTTP-ответе, он предоставит размер файла.

Источник:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...