Я смотрел в записи данных, и я использовал: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.
Look для использования 'класса BackgroundWorker'. Это был бы простой способ добиться этого. – bakala12
Stream.Write() всегда записывает все байты. – Botonomous
«Кажется, я не могу отслеживать количество записанных байт до тех пор, пока оно не будет полным»: я не вижу попыток сделать это в коде, который вы используете. Это проблема? –