2016-10-13 6 views
-1

Я смотрел в записи данных, и я использовал:C# Отслеживайте количество записанных байт

System.IO.File.WriteAllBytes(path, GetBytes()); 

Это работает для меня, но тогда я хотел бы получить прогресс в записанных байт, так что я могу иметь к нему добавлен прогресс. Я узнал, что мой метод не может подключиться к ProgressBar, так что я решил использовать это:

using (BinaryWriter writer = new BinaryWriter(System.IO.File.Open(path, FileMode.Create))) { 
      byte[] nextBytes = GetBytes(); // your logic to get what to write; 
      writer.Write(nextBytes); 
     } 

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

Спасибо заранее,

Update:

В верхней части проекта я delcare BackgroundWorker()

BackgroundWorker bw; 

Тогда, когда я начала загрузки I haev это:

bw = new BackgroundWorker(); 
      bw.WorkerReportsProgress = true; 
      bw.WorkerSupportsCancellation = true; 
      bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
      bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 

      bw.RunWorkerAsync(data); 

My doWork me ThOD:

 private void bw_DoWork (object sender, DoWorkEventArgs e) { 
     downloadData data = (downloadData) e.Argument; 
     _source = data.DownloadLocation + @"\"; 

     sem.WaitOne(); 

     //enters 
     updateStatusBar("- Downloading -", data, 0); 
     Video vid = youtube.GetVideo(data.Url); 
     byte[] bytes = vid.GetBytes(); 

     using (var writer = new BinaryWriter(System.IO.File.Open(_source + vid.FullName, FileMode.Create))) { 

      // do your read logic here and read into bytes 

      var bytesLeft = bytes.Length; 
      var bytesWritten = 0; 
      while (bytesLeft > 0) { 
       int chunk = Math.Min(64, bytesLeft); 

       writer.Write(bytes, bytesWritten, chunk); 
       bytesWritten += chunk; 
       bytesLeft -= chunk; 

       // calculate progress bar status 
       bw.ReportProgress(bytesWritten * 100/bytes.Length, data); 
      } 
     } 
     // Leaves 
     updateStatusBar("- Done -", data, 100); 

     sem.Release(); 
    } 

Мой Progresschanged метод:

private void bw_ProgressChanged (object sender, ProgressChangedEventArgs e) { 
     YoutubeData data = (YoutubeData) e.UserState; 
     updateStatusBar("Downloading: " + e.ProgressPercentage, data, e.ProgressPercentage); 
    } 

Метод обновления строки состояния:

 private void updateStatusBar(string txt, downloadData data, int progress) { 
     _downloadData.Remove(data); 
     data.ProgressText = txt; 
     data.Status = progress; 
     _downloadData.Add(data); 

     Dispatcher.Invoke(new Action(() => { 
      lv_DownloadData.ItemsSource = null; 
      lv_DownloadData.ItemsSource = _youtubeData; 
     })); 
    } 

Но теперь она замерзает мой WPF.

+0

Look для использования 'класса BackgroundWorker'. Это был бы простой способ добиться этого. – bakala12

+0

Stream.Write() всегда записывает все байты. – Botonomous

+1

«Кажется, я не могу отслеживать количество записанных байт до тех пор, пока оно не будет полным»: я не вижу попыток сделать это в коде, который вы используете. Это проблема? –

ответ

3

Запись байта в куски и использовать BackgroundWorker

using(var writer = new BinaryWriter(System.IO.File.Open(path, FileMode.Create)))) { 

     // do your read logic here and read into bytes 

     var bytesLeft = bytes.Length; 
     var bytesWritten = 0; 
     while(bytesLeft > 0) { 
      int chunk = Math.Min(64, bytesLeft); 
      writer.WriteBytes(array, bytesWritten, chunk); 
      bytesWritten += chunk; 
      bytesLeft -= chunk; 

      // calculate progress bar status 
      backgroundWorker.ReportProgress(bytesWritten * 100/array.Length); 
     } 
    } 

Обновление

ОК, это чисто непроверенных .. но пребывания мы мне .. Каждый BinaryWriter будет делать свою работу на BackgroundWorker

, поэтому вы создали фонового работника

BackgroundWorker bw = new BackgroundWorker(); 
bw.WorkerReportsProgress = true; 
bw.WorkerSupportsCancellation = true; 
bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 

Затем вам нужно, чтобы начать BackgroundWorker где-то с помощью bw.RunWorkerAsync()

void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // Do your task here 

    // report its progress 
    bw.ReportProgress(..); 
} 

void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    // update your progress bar here 

} 
+0

Как я могу это сделать, чтобы он мог обрабатывать x количество файлов? –

+0

@JoshC вы собираетесь делать это последовательно справа? означает показ прогресса 1 файла, а затем, когда он показывает следующий? –

+0

Нет, у меня одновременно есть несколько файлов. –

Смежные вопросы