Прогресс-бар для передачи файлов - PullRequest
0 голосов
/ 22 декабря 2011

Всем доброго дня.Я сейчас создаю передачу файлов для локальной сети и хочу добавить индикатор выполнения в эту передачу файлов, чтобы пользователь мог видеть ход передачи.Как я могу управлять индикатором выполнения в зависимости от размера и скорости передачи файла?

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

Кто-нибудь может подсказать, что мне делать?

Ответы [ 4 ]

2 голосов
/ 22 декабря 2011

Взгляните на http://www.codeproject.com/KB/files/Copy_files_with_Progress.aspx, это может дать вам то, что вы хотите, или, по крайней мере, установить в правильном направлении.

0 голосов
/ 22 декабря 2011

Лучший способ - поместить ваш файл передачи в один поток и обновить свой статус прогресса с помощью метода invoke. в моем моем коде я использую FTP для передачи одного файла zip. вот мое решение и пример кода:

1 - в вашей основной форме у вас должен быть индикатор выполнения, в моем коде я называю его "prbSendata"

2 - вызов передачи Тема:

Thread oThread = new Thread(Transfer);
oThread.Start(this);
this.Cursor = Cursors.WaitCursor;

3 - у вас должен быть такой файл передачи:

private static void Transfer(object obj)
{
    frmMain frmPar = (frmMain)obj;
    try
    {    
        string filename=_strStartingPath + @"\" + _strZipFileName + ".zip";
        FileInfo fileInf = new FileInfo(filename);
        string uri = _strFtpAddress + "/" + fileInf.Name;
        FtpWebRequest reqFTP;

        // Create FtpWebRequest object from the Uri provided

        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));

        // Provide the WebPermission Credintials

        reqFTP.Credentials = new NetworkCredential(_strFtpUserName, _strFtpPassword);

        // By default KeepAlive is true, where the control connection is 
        // not closed after a command is executed.

        reqFTP.KeepAlive = false;

        // Specify the command to be executed.

        reqFTP.Method = WebRequestMethods.Ftp.UploadFile;

        // Specify the data transfer type.

        reqFTP.UseBinary = true;

        // Notify the server about the size of the uploaded file

        reqFTP.ContentLength = fileInf.Length;

        // The buffer size is set to 2kb

        int buffLength = 2048;
        byte[] buff = new byte[buffLength];
        int contentLen;

        // Opens a file stream (System.IO.FileStream) to read the file to be uploaded

        FileStream fs = fileInf.OpenRead();

        // Stream to which the file to be upload is written

        Stream strm = reqFTP.GetRequestStream();

        // Read from the file stream 2kb at a time

        contentLen = fs.Read(buff, 0, buffLength);
        frmPar.prbSendata.Control.Invoke((MethodInvoker)(() =>{
            frmPar.prbSendata.Minimum=0;
            frmPar.prbSendata.Maximum=100;
        }));

        // Till Stream content ends
        long loadSize=0;
        while (contentLen != 0)
        {
            // Write Content from the file stream to the FTP Upload Stream
            loadSize+=contentLen;
            frmPar.prbSendata.Control.Invoke((MethodInvoker)(() =>{
                frmPar.prbSendata.Value=(int)(loadSize*100/fileInf.Length);
                }));

            strm.Write(buff, 0, contentLen);
            contentLen = fs.Read(buff, 0, buffLength);

        }

        // Close the file stream and the Request Stream

        strm.Close();
        fs.Close();
    }
    catch (Exception err)
    {
        MessageBox.Show("Error: " + err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    frmPar.txtResult.Invoke((MethodInvoker)(() =>frmPar.Cursor = Cursors.Default));

}
0 голосов
/ 22 декабря 2011

1) Создайте класс с именем hmmm FileSender

2) Ваш класс отправит данные, сгруппированные в блоки

3) Добавьте опцию в ваш класс, например MaxBlockSize - это будет максимальный объем данных, которые Вы отправите в одном блоке

4) сделать делегат OnBlockTransfer или что-то в этом роде

5) Сделать метод как FileSender.Send() ...

Этот метод начнет отправку файла, после каждого блока ваш класс будет выполнять ваш делегат. В вашем методе, вызванном делегатом, вы можете обновить строку состояния.

Скорость передачи проста; вам нужно проверить системное время и посчитать отправленные вами данные.

0 голосов
/ 22 декабря 2011

1) Вы должны отправлять файлы по частям в цикле. Таким образом, вы можете определить, каков прогресс в процентах.

2) Вы должны сделать это в BackgroundWorker (это компонент, доступный из панели инструментов). Фоновый рабочий имеет событие ProgressChanged, которое может быть вызвано вызовом ReportProgress в методе DoWork. Также не забудьте установить для свойства WorkerReportsProgress значение true.

3) В событии ProgressChanged измените пользовательский интерфейс, который должен соответствовать текущему состоянию.

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