- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是一个 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 的新异步模型的。我希望所提供的解决方案对其他人也有用。
最佳答案
这是一个允许您在复制文件时显示进度的解决方案:
public static class Copier
{
public static async Task CopyFiles(Dictionary<string, string> files, Action<double> progressCallback)
{
long total_size = files.Keys.Select(x => new FileInfo(x).Length).Sum();
long total_read = 0;
double progress_size = 10000.0;
foreach(var item in files)
{
long total_read_for_file = 0;
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))
{
await CopyStream(inStream , outStream, x =>
{
total_read_for_file = x;
progressCallback(((total_read + total_read_for_file)/ (double)total_size) * progress_size);
} );
}
}
total_read += total_read_for_file;
}
}
public static async Task CopyStream(Stream from, Stream to, Action<long> progress)
{
int buffer_size = 10240;
byte[] buffer = new byte[buffer_size];
long total_read = 0;
while (total_read < from.Length)
{
int read = await from.ReadAsync(buffer, 0, buffer_size);
await to.WriteAsync(buffer, 0, read);
total_read += read;
progress(total_read);
}
}
}
你可以这样使用它:
var dictionary = new Dictionary<string, string>
{
{"c:\\source_file1.dat", "c:\\destination_file1.dat"},
{"c:\\source_file2.dat", "c:\\destination_file2.dat"},
};
prgBaseMap.Maximum = 10000.0;
await Copier.CopyFiles(dictionary, prog => prgBaseMap.Value = prog);
此解决方案的工作原理是每次手动复制 10k 字节的文件内容(CopyStream
方法)。并且每次它更新进度条。
开始时,它会将源文件的总长度相加,以便能够计算出相对进度。
CopyFiles
方法将通过以相对于 10000.0
的进度回调它来向调用方报告进度。这就是进度条需要最大值为 10000.0 的原因。
您可以使用输入文件的长度总和,而不是使用 double 值 10000.0
。这使您还可以报告复制的字节总数。
在这种情况下,您必须计算调用方的长度总和。
关于c# - WPF 在异步文件复制期间显示进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33726729/
我正在编写一个应用程序,允许用户创建一个“问卷”,然后向其中添加问题。我正在使用核心数据来存储信息。我创建了一个问卷实体,并与问题实体建立了“一对多”关系。我的问题是,如果要允许用户复制(复制)整个调
有没有办法复制或复制 SharedPreference?或者我需要从一个变量中获取每个变量,然后将它们放入另一个变量中吗? 最佳答案 尝试这样的事情: //sp1 is the shared pref
下面的(A)和(B)有区别吗? (假设 NON ARC,如果重要的话) // --- (A) --- @interface Zoo : NSObject{} @property (copy) Dog
我正在尝试将 mysql SELECT 查询保存到文件中,如下所示: $result = mysqli_query($db,$sql); $out = fopen('tmp/csv.csv', 'w'
我需要创建一个 CVPixelBufferRef 的副本,以便能够使用副本中的值以按位方式操作原始像素缓冲区。我似乎无法使用 CVPixelBufferCreate 或 CVPixelBufferCr
我在 Source 文件夹中有一个 Active wave 录音 wave-file.wav。我需要使用新名称 wave-file-copy.wav 将此文件复制到 Destination 文件夹。
在使用 GNU Autotools 构建的项目中,我有一个脚本需要通过 make 修改以包含安装路径。这是一个小例子: configure.ac: AC_INIT(foobar, 1.0) AC_PR
我想将 SQL 的行复制到同一个表中。但是在我的表中,我有一个“文本”列。 使用此 SQL: CREATE TEMPORARY TABLE produit2 ENGINE=MEMORY SELECT
谁能给我解释一下 df2 = df1 df2 = df1.copy() df3 = df1.copy(deep=False) 我已经尝试了所有选项并执行了以下操作: df1 = pd.DataFram
Hazelcast 是否具有类似于 Ehcache 的复制? http://www.ehcache.org/generated/2.9.0/pdf/Ehcache_Replication_Guide.
我有以下拓扑。一个 Ubuntu 16.04。运行我的全局 MySQL 服务器的 Amazon AWS 上的实例。我想将此服务器用作许多本地主服务器(Windows 机器 MySQL 服务器)的从服务
使用 SQLyog,我正在测试表中是否设置了正确的值。我尝试过 SELECT type_service FROM service WHERE email='test@gmail.com' 因此,只输出
有人可以提供一些关于如何配置 ElasticSearch 进行复制的说明。我在 Windows 中运行 ES,并且了解如果我在同一台服务器上多次运行 bat 文件,则会启动一个单独的 ES 实例,并且
一 点睛 ThreadGroup 复制线程的两个方法。 public int enumerate(Thread list[]) // 会将 ThreadGroup 中的 active 线程全部复制到
一 点睛 ThreadGroup 复制线程组的两个方法。 public int enumerate(ThreadGroup list[]) // 相对于 enumerate(list,true) pu
官方documentation Cassandra 说: Configure the keyspace and create the new datacenter: Use ALTER KEYSPAC
This question already has answers here: How to weight smoothing by arbitrary factor in ggplot2? (2个答
我们有一个表格来表明对各种俱乐部的兴趣。输出将数据记录在 Excel 电子表格中,其中列有他们的首选姓名、姓氏、电子邮件、代词,以及他们感兴趣的俱乐部的相应列中的“1”(下面的模型)。 我们希望为俱乐
This question already has answers here: Closed 8 years ago. Possible Duplicate: In vim, how do I get
如何复制形状及其所在的单元格?当我手动复制时,形状会跟随单元格,但是当我使用宏进行复制时,我会得到除形状之外的所有其他内容。 Cells(sourceRow, sourceColumn).Copy C
我是一名优秀的程序员,十分优秀!