SHFileOperation DeleteFolder

SHFileOperation DeleteFolder分类:C/C++BOOLDeleteFolder(LPCTSTRlpszPath){  SHFILEOPSTRUCTFileOp; ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));  FileOp.fFlags=FOF_NOCONFIRMATION;  FileO

大家好,又见面了,我是你们的朋友全栈君。

分类: C/C++

BOOL DeleteFolder(LPCTSTR lpszPath)
{

  SHFILEOPSTRUCT FileOp;
  ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));

  FileOp.fFlags = FOF_NOCONFIRMATION;
  FileOp.hNameMappings = NULL;
  FileOp.hwnd = NULL;
  FileOp.lpszProgressTitle = NULL;
  FileOp.pFrom = lpszPath;
  FileOp.pTo = NULL;
  FileOp.wFunc = FO_DELETE;

  return SHFileOperation(&FileOp) == 0;
}

  这是网上找的一段代码,但是在删除目录时总是说无法读取源文件或磁盘。但是目录确实存在。

  查了查MSDN,网上看到别人也有同样的问题,看看他们的解答。原来SHFileOperation中的pFrom可以表示多个路径,各个路径之间以’\0’分隔,最后以’\0\0′(即连续的两个’\0′)结束,

于是改了过来。可是还是不行。

  去掉路径最后的一个’\'(“c:\\data\\”改为”c:\\data”),成功。

 下面这个函数需要注意同样的问题。

BOOL CopyFolder(LPCTSTR lpszFromPath,LPCTSTR lpszToPath)
{

    SHFILEOPSTRUCT FileOp;
    ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));
    
    FileOp.fFlags = FOF_NOCONFIRMATION ;
    FileOp.hNameMappings = NULL;
    FileOp.hwnd = NULL;
    FileOp.lpszProgressTitle = NULL;
    FileOp.pFrom = lpszFromPath;
    FileOp.pTo = lpszToPath;
    FileOp.wFunc = FO_COPY;
    
    return SHFileOperation(&FileOp) == 0;
}

=====================================

今天看到一个关于SHFileOperation函数使用的介绍,发现下面一些有用的资料,都是些之前未仔细了解的方面,这里把他们记录下来,留待以后查阅参考。

fFlags成员标志间的关系

标志

抑制的对话框

相关性与优先级

FOF_MULTIDESTFILES

FOF_FILESONLY

FOF_SILENT

如果设置,进度对话框不显示。

优先于FOF_SIMPLEPROGRESS标志。

FOF_SIMPLEPROGRESS

为FOF_SILENT标志所抑制。

FOF_RENAMEONCOLLISION

如果设置了这个标志,当被移动或拷贝的文件与已存在文件同名时置换对话框不会出现。

名字冲突时,如果FOF_NOCONFIRMATION标志设置,则操作继续。

如果二者都设置了,则它优先于FOF_NOCONFIRMATION。即,文件以给定的新名字复制,而不是覆盖。

FOF_NOCONFIRMATION

如果设置,确认对话框在任何情况下都不出现。

名字冲突时,引起文件覆盖,除非设置了FOF_RENAMEONCOLLISION标志。

FOF_NOCONFIRMMKDIR

抑制请求建立新文件夹的对话框

缺省目录作为严重错误产生一个错误消息框。

建立目录的确认对话框作为错误消息框是否显示依赖于FOF_NOERRORUI的设置。

FOF_NOERRORUI

抑制所有错误消息框。

优先于前一个标志。如果设置,则,缺省目录引起不被处理的异常,并且返回错误码。

 

删除文件

        文件删除是一个简单的操作,它仅仅影响到输入缓冲pFrom,而pTo缓冲被忽略。与文件复制一样,操作的详细情况依赖于标志的设置。相关的标志是:

标志

描述

FOF_SILENT

0x0004

这个操作不回馈给用户,就是说,不显示进度对话框。相关的消息框仍然显示。

FOF_NOCONFIRMATION

0x0010

这个标志使函数对任何遇到的消息框都自动回答Yes

FOF_ALLOWUNDO

0x0040

如果设置,这个标志强迫函数移动被删除的文件到‘回收站’中。否则,文件将被物理地从磁盘上删除。

FOF_FILESONLY

0x0080

设置这个标志导致函数仅仅删除文件,跳过目录项。它仅仅应用于指定通配符的情况。

FOF_SIMPLEPROGRESS

0x0100

这导致简化用户界面。使之只有动画而不报告被删除的文件名。代之的是显示lpszProgressTitle成员中指定的文字。(Win7实际中貌似不可用)

FOF_NOERRORUI

0x0400

如果设置了这个标志,任何发生的错误都不能使消息框显示,而是程序中返回错误码。

 

        这里出现的标志最要紧的是FOF_ALLOWUNDO,它决定文件是否一次就全部删除,或存储到‘回收站’中等候可能的恢复。如果FOF_ALLOWUNDO被设置,文件则被移动到回收站,并且这个操作可以被Undo(尽管可以手动Undo)。Undo特征仅在删除下可用,在拷贝与移动中没有等价的操作。

SHFileOperation()函数的返回值

        MSDN资料中说明,SHFileOperation()在成功时返回0,失败时返回非0值。显然这是真的,但并不是最有用的解释。重复测试这个函数,可以确信它有非常多的终止方式。事实上,我们经常在系统错误的提示中运行,在有些地方这个函数只是简单地返回从更靠近文件系统的其它程序中获得的返回码。下面列表给出了SHFileOperation()返回的最通常的部分错误。 

错误码

描述

2

如果你试图重命名多重文件,这个消息就会出现。描述是相当直接的:系统不能找到指定的文件。

7

在询问是否想要置换给定文件时,你回答了‘取消’,函数就返回这个错误码。它的描述也是相当的不明确—存储控制块被销毁

115

在试图重命名文件到不同的文件夹时,发生这个文件系统错。重命名文件只是改变文件名,而不能改变文件夹。

117

一个IOCTL(输入/输出控制),在目的路径中有错误时或取消了新目录的建立时,这个错误发生了。

123

你正在试图重命名一个文件,然而你给出的名字是一个已经存在的文件。它也有一个无用的描述:文件名,目录名,或卷标号的语法是不正确的

1026

 

在试图移动或拷贝一个不存在的文件时,出现这个文件系统错。一般地,它提示了,源缓冲中的某些东西应该修改一下。这个错误码弹出一个的错误框,你可以通过设置FOF_NOERRORUI标志抑制它的显示。

 

https://msdn.microsoft.com/en-us/library/windows/desktop/bb762164(v=vs.85).aspx

http://blog.chinaunix.net/uid-11477431-id-2872890.html

http://blog.csdn.net/tht2009/article/details/6762636

 


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/161010.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • NAT模式实现局域网物理机与虚拟机的互通访问「建议收藏」

    NAT模式实现局域网物理机与虚拟机的互通访问「建议收藏」玩过虚拟机的朋友都知道,不管是vbox还是vm,最常用的网络设置也不外乎3种:1、桥接模式:此模式下,虚拟机的操作系统就像和物理机同一段网络中的物理机一样,它可以访问网络中的任何机器,同时只要物理机可以访问网络,虚拟机也可以实现上网。此模式是懒人模式首选!但换来一个问题就是,如果你的物理机网络IP发生变化,虚拟机的IP也会相应的改变。如果IP变化对虚拟机有影响的环境,此模式慎用!

  • jquery插件autoComplete自动弹出

    jquery插件autoComplete自动弹出

  • MacPorts_macbook软件安装

    MacPorts_macbook软件安装起先是为了在mac上装gcc4.7,搜了半圈发现macports最方便。于是按照官方的介绍撸开了袖子干。参见:https://guide.macports.org/chunked/installing.html1.首先卸载了旧版本的macportsudoport-fpuninstallinstalled以及其他sudorm-rf\…

  • mybatis逆向工程插件

    mybatis逆向工程插件一个简单的利用mybatis连接数据库生成实体和mapper的工程下面是项目结构图:首先lib引入jar包:GeneratorSqlmap.java:importjava.io.File;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importor…

  • 苹果系统自带的计算机怎么恢复出厂设置,苹果Macbook电脑怎么恢复出厂设置【图文】…

    苹果系统自带的计算机怎么恢复出厂设置,苹果Macbook电脑怎么恢复出厂设置【图文】…苹果电脑预装Mac系统,简洁又安全,不过使用时间长了,难免会碰到一些问题,导致系统运行速度变得卡顿。恢复出厂设置是一个不错的办法,之前windows系统恢复出厂设置比较简单,但苹果Macbook电脑怎么恢复出厂设置?Mac系统提供恢复出厂系统的功能,主要分为离线和在线两种方法,感兴趣的一起来学习。苹果Macbook恢复出厂设置删除数据的方法:提醒:恢复出厂设置前请做好数据备份,以免对您造成损失。1…

  • MySql必知必会实战练习(四)主键、外键、sql约束、联结表

    本博将对主键、外键、MySql数据库约束和联结表的相关特性进行总结和实战1.主键表中的每一行都应该具有可以唯一标识自己的一列(或一组列),而这个承担标识作用的列称为主键如果没有主键,数据的管理

    2021年12月29日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号