项目中有新的需求,用Tree来显示远程服务器相应磁盘的所有目录。并对选定的文件或者文件夹进行操作。对于如何连接远程服务器并读取目录信息并用Tree显示不是这次总结的重点。
对文件或者文件夹的操作包括新建,复制,剪切,删除(这里包括永久删除和删除到回收站)。等等,不是已经有File类和Directory类里面的好多静态方法可以实现上面的功能吗?对,上面提到的静态方法的确已经很大程度的满足了我们的需求,但是。。。
1. 删除操作没有提供显示的确认(当然您可以自己确认),而且该删除操作是永久 删除。
2. 剪切(也就是对于的Move方法)只能是同一磁盘下面的操作,不能跨盘Move(对于文件夹而言)
3. 对于复制剪切或者删除多个文件不能显示进度条(像系统一样的进度条)
基于上面的原因我选择了使用Windows Shell里面的API--- SHFileOperation,它包含4个操作:FO_COPY,FO_DELETE,FO_MOVE,FO_RENAME,您可以看这里来了解。对于基本的操作不用多说,这里只是说用到的与C#的IO类库不用的用法。
1. 删除文件的时候确认操作:SHFILEOPSTRUCT里面的成员fFlags默认情况下会有确认操作的提示框,如果您不想要提示框,可以 shf.fFlags = FOF_NOCONFIRMATION;
2. 删除到回收站和永久删除:shf.fFlags = FOF_ALLOWUNDO,顾名思义,允许撤销的话将删除到回收站,否则将永久删除。
3. 操作文件或者文件夹的时候显示进度条:shf.fFlags = FOF_SIMPLEPROGRESS
4. 对于要删除的文件或者文件夹使用“\0\0”结束,即"D:\\New Text Document.txt\0\0"
5. 如果要操作多个文件或者文件夹 ,不同的路径用“\0”间隔,即"D:\\New Text Document.txt\0D:\\New Folder\0\0"
对于fFlags还有很多,您可以看这里了解。
示例代码如下:
2 {
3 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
4
5 public struct SHFILEOPSTRUCT
6 {
7
8 public IntPtr hwnd;
9
10 [MarshalAs(UnmanagedType.U4)]
11 public int wFunc;
12
13 public string pFrom;
14
15 public string pTo;
16
17 public short fFlags;
18
19 [MarshalAs(UnmanagedType.Bool)]
20 public bool fAnyOperationsAborted;
21
22 public IntPtr hNameMappings;
23
24 public string lpszProgressTitle;
25
26 }
27
28 [DllImport("shell32.dll", CharSet = CharSet.Auto)]
29
30 static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp);
31
32 const int FO_RENAME = 4;
33
34 const int FO_DELETE = 3;
35
36 const int FO_COPY = 2;
37
38 const int FO_MOVE = 1;
39
40 const int FOF_ALLOWUNDO = 0x40;
41
42 const int FOF_NOCONFIRMATION = 0x10; //Don't prompt the user.;
43
44 const int FOF_SIMPLEPROGRESS = 0x100;
45
46 public static void SendToRecyclyBin(string path)
47 {
48
49 SHFILEOPSTRUCT shf = new SHFILEOPSTRUCT();
50
51 shf.wFunc = FO_DELETE;
52
53 shf.fFlags = FOF_ALLOWUNDO;// | FOF_NOCONFIRMATION;
54
55 shf.pFrom = path;
56
57 //返回0表示操作成功
58 SHFileOperation(ref shf);
59
60 }
61
62 public static bool Copy(string from, string to)
63 {
64 SHFILEOPSTRUCT shf = new SHFILEOPSTRUCT();
65
66 shf.wFunc = FO_COPY;
67
68 shf.fFlags = FOF_ALLOWUNDO;
69
70 shf.pFrom = from;
71
72 shf.pTo = to;
73
74 return SHFileOperation(ref shf) == 0;
75
76 }
77
78 public static bool Move(string from, string to)
79 {
80
81 SHFILEOPSTRUCT shf = new SHFILEOPSTRUCT();
82
83 shf.wFunc = FO_MOVE;
84
85 shf.fFlags = FOF_ALLOWUNDO;
86
87 shf.pFrom = from;
88
89 shf.pTo = to;
90
91 return SHFileOperation(ref shf) == 0;
92
93 }
94
95 public static bool RENAME(string from, string to)
96 {
97
98 SHFILEOPSTRUCT shf = new SHFILEOPSTRUCT();
99
100 shf.wFunc = FO_RENAME;
101
102 shf.fFlags = FOF_ALLOWUNDO;
103
104 shf.pFrom = from;
105
106 shf.pTo = to;
107
108 return SHFileOperation(ref shf) == 0;
109
110 }
111 }
只是总结而已。。。