【发布时间】:2016-02-17 00:58:46
【问题描述】:
我是 wpf 新手,所以这个问题可能是微不足道的。 我正在尝试将文件从一个文件夹复制到另一个文件夹。我想在复制过程中显示一个进度条。
我的代码是这样的:
if (!System.IO.File.Exists(basemapDest))
{
await Copier.CopyFiles(new Dictionary<string, string>
{
{basemapSrc, basemapDest},
}, prog => prgBaseMap.Value = prog);
}
public static class Copier
{
public static async Task CopyFiles(Dictionary<string, string> files, Action<int> progressCallback)
{
for (var x = 0; x < files.Count; x++)
{
var item = files.ElementAt(x);
var from = item.Key;
var to = item.Value;
using (var outStream = new FileStream(to, FileMode.Create, FileAccess.Write, FileShare.Read))
{
using (var inStream = new FileStream(from, FileMode.Open, FileAccess.Read, FileShare.Read))
{
long fileLength = from.Length;
await inStream.CopyToAsync(outStream);
}
}
progressCallback((int)((x + 1) / files.Count) * 100);
}
}
}
我的 XAML 代码:
<StackPanel>
<ProgressBar x:Name="prgBaseMap" Height="10" Visibility="Collapsed"/>
</StackPanel>
虽然这适用于报告文件已复制,但在我进行复制时不会显示进度。我做错了什么?
*** 编辑,这不是stream.copyto with progress bar reporting的副本
引用的问题是使用 BackgroundWorker,如今许多人认为它已过时。这个问题是关于使用 .NET 的新异步模型。我希望提供的解决方案对其他人也有用。
【问题讨论】:
-
什么是
prgBaseMap?你想念那个类的INotifyPropertyChanged实现吗? -
您希望显示什么样的进度?您发布的代码将在复制每个文件后更新进度。您只是在复制一个文件,所以我不希望在屏幕上看到任何有用的进度显示。如果您希望在复制文件时 更新进度,则必须使用更明确的方式进行复制,并在读取文件的较小块并将其写入新文件时更新进度.
-
很遗憾,您的要求不是很清楚。请提供可靠地重现问题的a good, minimal, complete code example,并准确描述该代码的作用以及与您希望它做的不同之处。
-
PeterDuniho,@torvin,你们都是正确的,也许我的问题不是最详细的。我想显示的进度是在复制文件时,在这部分代码中:await nStream.CopyToAsync(outStream);我已经添加了我的 prgBaseMap 的 Xaml 声明基本上,我想显示一个进度指示器,因为正在下载一个文件,估计完成了多少时间等