分享

函数ShFileOperation对文件的操作与注意事项

 semo_zhang 2012-03-08
函数ShFileOperation对文件的操作与注意事项
  1. SHFileOperation   
  2.   
  3. 函数功能描述:文件操作,与 Shell 的动作相同.   
  4. 函数原型:
  5. #include<shellapi.h>   
  6.   
  7. WINSHELLAPI int WINAPI SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);   
  8.   
  9.   
  10.   
  11. 参数:   
  12.   
  13. typedef struct _SHFILEOPSTRUCT   
  14.   
  15. {   
  16.   
  17.          HWND             hwnd;   //父窗口句柄   
  18.   
  19.          UINT             wFunc; //要执行的动作   
  20.   
  21.          LPCTSTR          pFrom; //源文件路径,可以是多个文件   
  22.   
  23.          LPCTSTR          pTo;    //目标路径,可以是路径或文件名   
  24.   
  25.          FILEOP_FLAGS     fFlags; //标志,附加选项   
  26.   
  27.          BOOL             fAnyOperationsAborted; //是否可被中断   
  28.   
  29.          LPVOID           hNameMappings;         //文件映射名字,可在其它 Shell 函数中使用   
  30.   
  31.          LPCTSTR          lpszProgressTitle; // 只在 FOF_SIMPLEPROGRESS 时,指定对话框的标题。   
  32.   
  33. } SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;  
  34.   
  35. =======================   
  36.   
  37. wFunc 可以为:   
  38.   
  39. /FO_MOVE           0x0001 移动文件   
  40.   
  41. FO_COPY            0x0002 复制文件   
  42.   
  43. FO_DELETE          0x0003 删除文件,只使用 pFrom   
  44.   
  45. FO_RENAME          0x0004 文件重命名   
  46.   
  47.   
  48.   
  49. fFlags可以为:   
  50.   
  51. FOF_MULTIDESTFILES          0x0001 //pTo 指定了多个目标文件,而不是单个目录   
  52.   
  53. FOF_CONFIRMMOUSE            0x0002   
  54.   
  55. FOF_SILENT                  0x00044 // 不显示一个进度对话框   
  56.   
  57. FOF_RENAMEONCOLLISION       0x0008 // 碰到有抵触的名字时,自动分配前缀   
  58.   
  59. FOF_NOCONFIRMATION          0x0010 // 不对用户显示提示   
  60.   
  61. FOF_WANTMAPPINGHANDLE       0x0020 // 填充 hNameMappings 字段,必须使用 SHFreeNameMappings 释放   
  62.   
  63. FOF_ALLOWUNDO               0x0040 // 允许撤销   
  64.   
  65. FOF_FILESONLY               0x0080 // 使用 *.* 时, 只对文件操作   
  66.   
  67. FOF_SIMPLEPROGRESS          0x0100 // 简单进度条,意味者不显示文件名。   
  68.   
  69. FOF_NOCONFIRMMKDIR          0x0200 // 建新目录时不需要用户确定   
  70.   
  71. FOF_NOERRORUI               0x0400 // 不显示出错用户界面   
  72.   
  73. FOF_NOCOPYSECURITYATTRIBS 0x0800 // 不复制 NT 文件的安全属性   
  74.   
  75. FOF_NORECURSION             0x1000 // 不递归目录   
  76.   
  77.   
  78.   
  79. 返回值:   
  80.   
  81. 函数成功返回 0 ,失败返回非 0 。   
  82.   
  83.   
  84.   
  85.   
  86.   
  87. 例子:   
  88.   
  89. 1. 将 C:\Test.txt 拷贝到 D:\   
  90.   
  91.   
  92.   
  93.     SHFILEOPSTRUCT lpsh;   
  94.   
  95.     ZeroMemory(&lpsh,sizeof(lpsh));   
  96.   
  97.     lpsh.hwnd= HWND_DESKTOP;   
  98.   
  99.     lpsh.fFlags=FOF_NOCONFIRMATION|FOF_SIMPLEPROGRESS ;   
  100.   
  101.     lpsh.wFunc=FO_COPY; // FO_MOVE 则是移动   
  102.   
  103.     lpsh.pFrom= "C:\Test.txt";     
  104.   
  105.     lpsh.pTo = "D:\"  
  106.   
  107.    if( 0 != SHFileOperation(&lpsh))   
  108.   
  109.     {   
  110.   
  111.        AfxMessageBox("复制文件出错,请检查");   
  112.   
  113.       return ;   
  114.   
  115.     }   
  116.   
  117.   
  118.   
  119. 2. 删除 D:\Test.txt   
  120.   
  121.     SHFILEOPSTRUCT lpsh;   
  122.   
  123.     ZeroMemory(&lpsh,sizeof(lpsh));   
  124.   
  125.     lpsh.hwnd= HWND_DESKTOP;   
  126.   
  127.     lpsh.fFlags=FOF_NOCONFIRMATION|FOF_SIMPLEPROGRESS ;   
  128.   
  129.     lpsh.wFunc=FO_DELETE;   
  130.   
  131.     lpsh.pFrom= "D:\Test.txt";     
  132.   
  133.    if( 0 != SHFileOperation(&lpsh))   
  134.   
  135.     {   
  136.   
  137.        AfxMessageBox("删除文件出错,请检查");   
  138.   
  139.       return ;   
  140.   
  141.     }   
  142.   
  143.   
  144.   
  145. 3.重命名   
  146.   
  147.     SHFILEOPSTRUCT lpsh;   
  148.   
  149.     ZeroMemory(&lpsh,sizeof(lpsh));   
  150.   
  151.     lpsh.hwnd= HWND_DESKTOP;   
  152.   
  153.     lpsh.fFlags=FOF_NOCONFIRMATION|FOF_SIMPLEPROGRESS ;   
  154.   
  155.     lpsh.wFunc=FO_RENAME;   
  156.   
  157.     lpsh.pFrom= "D:\Test.txt";     
  158.   
  159.     lpsh.pTo = "D:\Test2.txt";   
  160.   
  161.    if( 0 != SHFileOperation(&lpsh))   
  162.   
  163.     {   
  164.   
  165.        AfxMessageBox("重命名文件出错!");   
  166.   
  167.       return ;   
  168.   
  169.     }   
  170.   
  171. 注意事项
  172. 参数pTo、pFrom必须是以 双0 结束的,原文为:
  173. pFrom   
        
  174.     Pointer to a buffer that specifies one or more source file names. Multiple names must be null-separated. The list of names must be double null-terminated.
  175. a.如果是直接赋值:
  176. WCHAR strSrc[MAX_PATH] = _T("g:\\123");
    WCHAR strDst[MAX_PATH] = _T("g:\\456");
  177. 这样就可以成功编译。
  178.   
  179. b.如果pTo、pFrom从CString获得,则:
  180. WCHAR SrcFolder[MAX_PATH],DestFolder[MAX_PATH];
  181. wcscpy_s(SrcFolder, Source);
    wcscpy_s(DestFolder,m_Path);
    SrcFolder[wcslen(SrcFolder) + 1] = 0;
    DestFolder[wcslen(DestFolder) + 1] = 0;
    (其中,Source与m_Path是在其他地方获取的值)
  182. 造成这种差异的原因是:CString在结尾并没有"\0",所以需要我们添加。
  183.   
  184.   
  185. 4.VB   
  186.   
  187.   
  188.   
  189. Public Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long   
  190.   
  191. Public Const FO_COPY = &H2   
  192.   
  193. Public Const FOF_ALLOWUNDO = &H40   
  194.   
  195.   
  196.   
  197. Public Sub ShellCopyFile(Source As String, Dest As String)   
  198.   
  199. Dim result As Long   
  200.   
  201. Dim fileop As SHFILEOPSTRUCT   
  202.   
  203. With fileop   
  204.   
  205.     .hwnd = 0   
  206.   
  207.     .wFunc = FO_COPY   
  208.   
  209.     .pFrom = Source & vbNullChar & vbNullChar   
  210.   
  211.     .pTo = Dest & vbNullChar & vbNullChar   
  212.   
  213.     .fFlags = FOF_ALLOWUNDO   
  214.   
  215. End With   
  216.   
  217.   
  218.   
  219. result = SHFileOperation(fileop)   
  220.   
  221.   
  222.   
  223. If result <> 0 Then   
  224.   
  225. 'Msgbox the error that occurred in the API.   
  226.   
  227.     MsgBox Err.LastDllError, vbCritical Or vbOKOnly   
  228.   
  229. Else   
  230.   
  231.     If fileop.fAnyOperationsAborted <> 0 Then   
  232.   
  233.      MsgBox "Operation Failed", vbCritical Or vbOKOnly   
  234.   
  235.     End If   
  236.   
  237. End If   
  238.   
  239. End Sub  
  1. 单开一个内存,清空,把pForm指向这里,把内容拷进去   
  2.   
  3.   
  4.   
  5. SHFILEOPSTRUCT Op;   
  6.   
  7. ZeroMemory(&Op, sizeof(Op));   
  8.   
  9.   
  10.   
  11. TCHAR ToBuf[MAX_PATH];   
  12.   
  13. TCHAR FromBuf[MAX_PATH];   
  14.   
  15. ZeroMemory(ToBuf, sizeof(ToBuf));   
  16.   
  17. ZeroMemory(FromBuf, sizeof(FromBuf));   
  18.   
  19. lstrcpy(FromBuf, strDeleteFile);   
  20.   
  21.   
  22.   
  23. Op.hwnd = NULL;   
  24.   
  25. Op.pFrom = FromBuf;   
  26.   
  27. Op.pTo = ToBuf;   
  28.   
  29. Op.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI;   
  30.   
  31. Op.fAnyOperationsAborted = FALSE;   
  32.   
  33. Op.hNameMappings = NULL;   
  34.   
  35. Op.lpszProgressTitle = NULL;   
  36.   
  37. Op.wFunc = FO_DELETE;   
  38.   
  39.   
  40.   
  41. SHFileOperation(&Op);  
  42. ===================   
  43.   
  44. vb.net   
  45.   
  46. Public Structure SHFILEOPSTRUCT   
  47.   
  48. Dim hwnd As IntPtr   
  49.   
  50. Dim wFunc As Integer   
  51.   
  52. Dim pFrom As String   
  53.   
  54. Dim pTo As String   
  55.   
  56. Dim fFlags As Short   
  57.   
  58. Dim fAnyOperationsAborted As Integer   
  59.   
  60. Dim hNameMappings As IntPtr   
  61.   
  62. Dim lpszProgressTitle As String   
  63.   
  64. End Structure   
  65.   
  66.   
  67.   
  68. Public Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (ByRef lpFileOp As SHFILEOPSTRUCT) As Integer   
  69.   
  70.   
  71.   
  72. ======================   
  73.   
  74. vb:   
  75.   
  76. Type SHFILEOPSTRUCT   
  77.   
  78. hWnd As Long   
  79.   
  80. wFunc As Long   
  81.   
  82. pFrom As String '必须用 pFrom & vbNullChar & vbNullChar   
  83.   
  84. pTo As String '同pFrom   
  85.   
  86. fFlags As Integer   
  87.   
  88. fAnyOperationsAborted As Boolean   
  89.   
  90. hNameMappings As Long   
  91.   
  92. lpszProgressTitle As String   
  93.   
  94. End Type   
  95.   
  96. Public Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多