主页 > 编程资料 > C# >
发布时间:2015-09-26 作者:网络 阅读:472次
                 Code List:
-------------------------------------------------------------------------
/*****************************************************************
** File Name:       frmMain.cs
** Copyright (c) 1999 -2003 
** Creator:          FirePhoenix
** Created Date:     2004-11-13 15:24
** Modifier:
** Modify Date:
** Description:          
** Version:1.0
******************************************************************/
#region Using Directives
using System;
using System.IO ;
using System.Xml ;
using System.Collections ;
using System.Reflection ;
using System.Text ;
using System.Data ;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using System.Threading ;
#endregion
namespace WindowsApplication4
{
 /// <summary>
 /// Copy Large File
 /// </summary>
 public class frmMain : System.Windows.Forms.Form
 {
  #region
  private System.Windows.Forms.ProgressBar progressBar1;
  private System.Windows.Forms.Button btnCopy;
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;
  public frmMain()
  {
   //
   // Windows 窗体设计器支持所必需的
   //
   InitializeComponent();
   //
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
  }
  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null) 
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }
  #region Initialize Components
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   this.progressBar1 = new System.Windows.Forms.ProgressBar();
   this.btnCopy = new System.Windows.Forms.Button();
   this.SuspendLayout();
   // 
   // 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;
   // 
   // btnCopy
   // 
   this.btnCopy.Location = new System.Drawing.Point(8, 48);
   this.btnCopy.Name = "btnCopy";
   this.btnCopy.TabIndex = 1;
   this.btnCopy.Text = "Copy";
   this.btnCopy.Click += new System.EventHandler(this.btnCopy_Click);
   // 
   // frmMain
   // 
   this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
   this.ClientSize = new System.Drawing.Size(232, 77);
   this.Controls.Add(this.btnCopy);
   this.Controls.Add(this.progressBar1);
   this.Name = "frmMain";
   this.Text = "Copy File";
   this.ResumeLayout(false);
  }
  #endregion
  /// <summary>
  /// Entry Point
  /// </summary>
  [STAThread]
  static void Main() 
  {
   Application.Run(new frmMain());
  }
  #endregion
  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 ; 
  }
 }
}


关键字词: