111,093
社区成员




using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
namespace WindowsFormsApplication1
{
/// <summary>
/// 继续滥用委托
/// </summary>
/// <param name="sourceFile"></param>
/// <param name="targetFile"></param>
public delegate void CopyProgressHandler(String sourceFile, String targetFile);
/// <summary>
/// 拷贝文件夹类
/// </summary>
public class CopyDirectory
{
/// <summary>
/// 继续滥用事件
/// </summary>
public event CopyProgressHandler CopyProgress;
#region Win32 API
private const int MAX_PATH = 260;
private const int MAX_ALTERNATE = 14;
[StructLayout(LayoutKind.Sequential)]
private struct FILETIME
{
public uint dwLowDateTime;
public uint dwHighDateTime;
};
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct WIN32_FIND_DATA
{
public FileAttributes dwFileAttributes;
public FILETIME ftCreationTime;
public FILETIME ftLastAccessTime;
public FILETIME ftLastWriteTime;
public uint nFileSizeHigh; //changed all to uint from int, otherwise you run into unexpected overflow
public uint nFileSizeLow; //| http://www.pinvoke.net/default.aspx/Structures/WIN32_FIND_DATA.html
public uint dwReserved0; //|
public uint dwReserved1; //v
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_ALTERNATE)]
public string cAlternate;
}
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData);
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern bool FindNextFile(IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool FindClose(IntPtr hFindFile);
#endregion
/// <summary>
/// 拷贝
/// </summary>
/// <param name="sourceDirectory">源文件</param>
/// <param name="targetDirectory">目标文件夹</param>
public void Copy(String sourceDirectory, String targetDirectory)
{
IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
WIN32_FIND_DATA findData;
IntPtr findHandle;
findHandle = FindFirstFile(sourceDirectory + "*.*", out findData);
if (findHandle != INVALID_HANDLE_VALUE)
{
do
{
if ((findData.dwFileAttributes & FileAttributes.Directory) != 0)
{
if (findData.cFileName != "." && findData.cFileName != "..")
{
Copy(String.Format("{0}{1}{2}", sourceDirectory, findData.cFileName, "\\"), targetDirectory);
}
}
else
{
String strFile = sourceDirectory + findData.cFileName;
if (File.Exists(strFile))
{
try
{
FileInfo fileInfo = new FileInfo(strFile);
String strCopyTargetFile = String.Format("{0}{1}", targetDirectory, fileInfo.Name);
if (CopyProgress != null)
{
// 触发事件,通知界面
CopyProgress(strFile, strCopyTargetFile);
}
// 拷贝文件
File.Copy(strFile, strCopyTargetFile);
}
catch
{
}
}
}
}
while (FindNextFile(findHandle, out findData));
FindClose(findHandle);
}
}
}
}
using System;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void CopyProgress(String sourceFile, String targetFile)
{
if (progressBar1.Value >= progressBar1.Maximum)
{
progressBar1.Value = 0;
}
progressBar1.Value++;
label1.Text = String.Format("从 {0} 拷贝到 {1}", sourceFile, targetFile);
Application.DoEvents();
}
private void Form1_Load(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
progressBar1.Dock = DockStyle.Top;
label1.Dock = DockStyle.Top;
String targetDirectory = @"D:\TestCopy\";
if (!System.IO.Directory.Exists(targetDirectory))
{
System.IO.Directory.CreateDirectory(targetDirectory);
}
// 创建一个拷贝文件夹,并且搞好事件
CopyDirectory copyDirectory = new CopyDirectory();
copyDirectory.CopyProgress += CopyProgress;
copyDirectory.Copy(@"C:\Program Files\", targetDirectory);
}
}
}