2013-03-17 98 views
4

我可以用一个进度条来显示如何学习WriteAllBytes进步

File.WriteAllBytes(file, array) 

在C#中的进展如何?

+0

不,您需要使用['FileStream.Write'](例如http://msdn.microsoft.com/en-us/library/system.io.filestream.write.aspx)制作自己的函数。 – Blorgbeard 2013-03-17 22:46:44

回答

5

由于WriteAllBytes是一种同步方法,因此您无法对操作进行任何操作,直到它完成。

你需要做的是有一个像WriteAllBytes这样的方法,但是写成异步的,比如http://msdn.microsoft.com/en-AU/library/jj155757.aspx。您可以每隔一段时间让异步方法停止并将其进度报告给GUI,因为它分开运行。

8

编号

您需要使用循环写入块中的字节。像下面的东西应该让你开始。请注意,这需要在后台线程中运行。我在使用WinForms,你可以使用BackgroundWorker

using(var stream = new FileStream(...)) 
using(var writer = new BinaryWriter(stream)) { 
    var bytesLeft = array.Length; // assuming array is an array of bytes 
    var bytesWritten = 0; 
    while(bytesLeft > 0) { 
     var chunkSize = Math.Min(64, bytesLeft); 
     writer.WriteBytes(array, bytesWritten, chunkSize); 
     bytesWritten += chunkSize; 
     bytesLeft -= chunkSize; 
     // notify progressbar (assuming you're using a background worker) 
     backgroundWorker.ReportProgress(bytesWritten * 100/array.Length); 
    } 
} 

编辑:正如Patashi在下面指出的,你也可以在你的任务中等待。我认为我的方法非常简单,并且不需要任何额外的线程资源(除了需要执行操作的一个后台线程外)。这是传统方式,运作良好。