using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
namespace csharp
{
class Program
{
public const short FILE_ATTRIBUTE_NORMAL = 0x80;
public const short INVALID_HANDLE_VALUE = -1;
public const uint GENERIC_READ = 0x80000000;
public const uint GENERIC_WRITE = 0x40000000;
public const uint CREATE_NEW = 1;
public const uint CREATE_ALWAYS = 2;
public const uint OPEN_EXISTING = 3;
public const uint FILE_FLAG_NO_BUFFERING = 0x20000000;
public const uint FILE_FLAG_WRITE_THROUGH = 0x80000000;
public const uint FILE_SHARE_READ = 0x00000001;
public const uint FILE_SHARE_WRITE = 0x00000002;
// Use interop to call the CreateFile function.
// For more information about CreateFile,
// see the unmanaged MSDN reference library.
[DllImport("kernel32.dll", SetLastError = true)]
static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,
uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
uint dwFlagsAndAttributes, IntPtr hTemplateFile);
static void Main(string[] args)
{
bool useBuffer = false;
SafeFileHandle fr = CreateFile("d:\\source", GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, useBuffer? 0:FILE_FLAG_NO_BUFFERING , IntPtr.Zero);
SafeFileHandle fw = CreateFile("d:\\dest", GENERIC_WRITE, FILE_SHARE_READ, IntPtr.Zero, CREATE_ALWAYS,useBuffer? 0:(FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH), IntPtr.Zero);
int bufferSize = useBuffer? 1024*1024*32:1024 * 1024 * 32;
FileStream fsr = new FileStream(fr, FileAccess.Read);
FileStream fsw = new FileStream(fw, FileAccess.Write);
BinaryReader br = new BinaryReader(fsr);
BinaryWriter bw = new BinaryWriter(fsw);
byte[] buffer = new byte[bufferSize];
Int64 len = fsr.Length;
DateTime start = DateTime.Now;
TimeSpan ts;
while (fsr.Position < fsr.Length)
{
int readCount = br.Read(buffer, 0, bufferSize);
bw.Write(buffer, 0, readCount);
ts = DateTime.Now.Subtract(start);
double speed=(double)fsr.Position / ts.TotalMilliseconds * 1000 / (1024 * 1024);
double progress=(double)fsr.Position / len * 100;
Console.WriteLine("Speed:{0}, Progress:{1}",speed ,progress );
}
br.Close();
bw.Close();
sw.Close();
Console.WriteLine("End");
Console.ReadLine();
}
}
}