111,094
社区成员




public long GetDirectoryLength(string dirPath){
if(!Directory.Exists(dirPath))
return 0;
long len=0;
DirectoryInfo di=new DirectoryInfo(dirPath);
foreach(FileInfo fi in di.GetFiles()){
len+=fi.Length;
}
DirectoryInfo[] dis=di.GetDirectories();
if(dis.Length> 0){
for(int i=0;i <dis.Length;i++){
len+=GetDirectoryLength(dis[i].FullName);
}
}
return len;
}
private void initializecomponent()
{
//
// progressbar1
//
this.progressbar1.location = new system.drawing.point(8, 16);
this.progressbar1.name = "progressbar1";
this.progressbar1.size = new system.drawing.size(208, 16);
this.progressbar1.tabindex = 0;
...
}
int totalsize; //total size
int position; //position
const int buffer_size = 4096;
byte[] buffer;
stream stream;
private void btncopy_click(object sender, system.eventargs e)
{
string strfile = "";
openfiledialog dlg = new openfiledialog();
if ( dlg.showdialog() == dialogresult.ok )
{
strfile = dlg.filename ;
}
else
{
return ;
}
filestream fs = new filestream( strfile , filemode.open , fileaccess.read ) ;
totalsize = (int)fs.length ;
stream = fs;
//delete file which aready exists.
if ( file.exists( "c:\\copyedfile.bin" ) )
file.delete( "c:\\copyedfile.bin" );
//copy file while larger than 4kb.
if ( totalsize > buffer_size )
{
buffer = new byte[ buffer_size ];
// async invoke
stream.beginread( buffer , 0 , buffer_size , new asynccallback( asynccopyfile ) , null );
}
else
{
fs.close();
}
}
/// <summary>
/// asynchronously copy file
/// </summary>
/// <param name="ar"></param>
private void asynccopyfile( iasyncresult ar )
{
int readedlength ;
// lock filestream
lock( stream )
{
readedlength = stream.endread( ar ); // when stream endread, get readed length
}
// write to disk
filestream fswriter = new filestream( "c:\\copyedfile.bin" , filemode.append , fileaccess.write );
fswriter.write( buffer , 0 , buffer.length );
fswriter.close();
// current stream position
position += readedlength;
// response ui
methodinvoker m = new methodinvoker( synchprogressbar );
m.begininvoke( null , null );
if ( position >= totalsize ) // read over.
{
stream.close(); //close filestream
return ;
}
// continue to read and write
lock ( stream )
{
int leftsize = totalsize - position;
if ( leftsize < buffer_size )
buffer = new byte[ leftsize ];
stream.beginread( buffer , 0 , buffer.length , new asynccallback( asynccopyfile ) , null );
}
}
private void synchprogressbar()
{
this.progressbar1.maximum = totalsize;
this.progressbar1.value = position ;
}