
CopyDirectory
1
public class Kernel32
2
{
3
public const int MAX_PATH = 260;
4
public const uint MAXDWORD = 0xFFFFFFFF;
5
public const int INVALID_HANDLE_VALUE = -1;
6
public const int FILE_ATTRIBUTE_ARCHIVE = 0x20;
7
public const int FILE_ATTRIBUTE_DIRECTORY = 0x10;
8
public const int FILE_ATTRIBUTE_HIDDEN = 0x2;
9
public const int FILE_ATTRIBUTE_NORMAL = 0x80;
10
public const int FILE_ATTRIBUTE_READONLY = 0x1;
11
public const int FILE_ATTRIBUTE_SYSTEM = 0x4;
12
public const int FILE_ATTRIBUTE_TEMPORARY = 0x100;
13
public const int ERROR_NO_MORE_FILES = 18;
14
15
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
16
public static extern IntPtr FindFirstFileW([MarshalAs(UnmanagedType.LPWStr)] String lpFileName, [In, Out] ref WIN32_FIND_DATAW lpFindFileData);
17
18
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
19
public static extern Boolean FindNextFileW(IntPtr hFindFile, [In, Out] ref WIN32_FIND_DATAW lpFindFileData);
20
21
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
22
public static extern int CopyFileW([MarshalAs(UnmanagedType.LPWStr)] String lpExistingFileName, [MarshalAs(UnmanagedType.LPWStr)] String lpNewFileName, int bFailIfExists);
23
24
[DllImport("kernel32.dll", SetLastError = true)]
25
public static extern int FindClose(IntPtr handleFile);
26
27
[DllImport("kernel32.dll", SetLastError = true)]
28
public static extern int CreateDirectoryW([MarshalAs(UnmanagedType.LPWStr)]String directoryName, [MarshalAs(UnmanagedType.LPStruct)] SECURITY_ATTRIBUTES securityAttributes);
29
}
30
31
32
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode), Serializable]
33
public struct WIN32_FIND_DATAW
34
{
35
[FieldOffset(0)]
36
public int dwFileAttributes;
37
[FieldOffset(4)]
38
public long ftCreationTime;
39
[FieldOffset(12)]
40
public long ftLastAccessTime;
41
[FieldOffset(20)]
42
public long ftLastWriteTime;
43
[FieldOffset(28)]
44
public int nFileSizeHigh;
45
[FieldOffset(32)]
46
public int nFileSizeLow;
47
[FieldOffset(36)]
48
public int dwReserved0;
49
[FieldOffset(40)]
50
public int dwReserved1;
51
[FieldOffset(44)]
52
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 520)]
53
public String cFileName;
54
[FieldOffset(564)]
55
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 28)]
56
public String cAlternateFileName;
57
}
58
59
[StructLayout(LayoutKind.Sequential)]
60
public class SECURITY_ATTRIBUTES
61
{
62
[MarshalAs(UnmanagedType.U4)]
63
public int nLength;
64
public IntPtr lpSecurityDescriptor;
65
public Boolean bInheritHandle;
66
}
67
68
public class ShellCopyDirectory
69
{
70
/**//// <summary>
71
/// Copy current folder to dest folder, like Copy C:\temp\src to D:\temp\des, at last the result is D:\temp\des\src
72
/// </summary>
73
/// <param name="src">src folder path</param>
74
/// <param name="des">des folder path</param>
75
/// <returns></returns>
76
public static Boolean CopyDirectory(String src, String des)
77
{
78
if (!src.StartsWith("\\\\"))
79
{
80
src = "\\\\?\\" + src;
81
}
82
83
if (!src.EndsWith("\\"))
84
{
85
src += "\\";
86
}
87
88
if (!des.StartsWith("\\\\"))
89
{
90
des = "\\\\?\\" + des;
91
}
92
93
if (!des.EndsWith("\\"))
94
{
95
des += "\\";
96
}
97
String currentFolder = src.Substring(src.LastIndexOf("\\", src.Length - 2) + 1);
98
if ((!currentFolder.EndsWith(":\\")) && (!currentFolder.EndsWith("?\\")))
99
{
100
des += currentFolder;
101
}
102
103
SECURITY_ATTRIBUTES lpSecurityAttributes = new SECURITY_ATTRIBUTES();
104
DirectorySecurity security = new DirectorySecurity();
105
security.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Allow));
106
lpSecurityAttributes.nLength = Marshal.SizeOf(lpSecurityAttributes);
107
byte[] byteSrc = security.GetSecurityDescriptorBinaryForm();
108
IntPtr IntPtrDest = Marshal.AllocHGlobal(byteSrc.Length);
109
Marshal.Copy(byteSrc, 0, IntPtrDest, byteSrc.Length);
110
lpSecurityAttributes.lpSecurityDescriptor = IntPtrDest;
111
lpSecurityAttributes.bInheritHandle = true;
112
Kernel32.CreateDirectoryW(des, lpSecurityAttributes);
113
114
String srcFile = String.Empty;
115
String desFile = String.Empty;
116
IntPtr hFile = IntPtr.Zero;
117
WIN32_FIND_DATAW findData = new WIN32_FIND_DATAW();
118
hFile = Kernel32.FindFirstFileW(src + "*", ref findData);
119
if (hFile.ToInt32() != Kernel32.INVALID_HANDLE_VALUE)
120
{
121
do
122
{
123
if (findData.cFileName[0] != '.')
124
{
125
srcFile = src + findData.cFileName;
126
desFile = des + findData.cFileName;
127
//desFile = des;
128
if ((findData.dwFileAttributes & Kernel32.FILE_ATTRIBUTE_DIRECTORY) != 0)
129
{
130
if (!CopyDirectory(srcFile, des))
131
{
132
Console.WriteLine("CopyDirectory {0} to {1} error, error code is {2}", srcFile, desFile, Marshal.GetLastWin32Error());
133
return false;
134
}
135
}
136
else
137
{
138
if (Kernel32.CopyFileW(srcFile, desFile, 0) == 0)
139
{
140
Console.WriteLine("CopyFile {0} to {1} error, error code is {2}", srcFile, desFile, Marshal.GetLastWin32Error());
141
return false;
142
}
143
}
144
}
145
Console.WriteLine(findData.cFileName);
146
Console.WriteLine(Marshal.GetLastWin32Error());
147
}
148
while (Kernel32.FindNextFileW(hFile, ref findData) == true);
149
150
Kernel32.FindClose(hFile);
151
int error = Marshal.GetLastWin32Error();
152
if (error != Kernel32.ERROR_NO_MORE_FILES)
153
{
154
Console.WriteLine("Get last error no is {0}", error);
155
return false;
156
}
157
}
158
return true;
159
}
160
}
by long 
posted @ 2009-01-13 18:00
xiaopohai_long 阅读(246)
评论(1) 编辑 收藏