【问题标题】:Prevent SHFILEOPERATION from deleting the target directory防止 SHFILEOPERATION 删除目标目录
【发布时间】:2013-11-05 16:14:29
【问题描述】:

我在堆栈上找到了使用 SHFILEOPERATION 删除指定目录中的所有文件的示例代码,效果很好。我唯一的问题是它删除了进程中的目标目录。如果在 TSHFILEOpStruct 中为 pfrom 指定的目录在它包含的所有文件被删除后仍然存在,我会更喜欢它。

我认为通过设置 FOF_FILESONLY 标志它只会删除文件,但也许我错过了一些东西。

我将 TSHFILEOpStruct 设置为以下内容:

FillChar(FileOp, SizeOf(fileOp), 0);
FileOp.wFunc  := FO_DELETE;
FileOp.pFrom  := PChar(DirName+#0); //Target directory string needs to be Double Null Terminated
FileOp.fFlags := FOF_FILESONLY or FOF_NOCONFIRMATION or FOF_SILENT or FOF_NOERRORUI;
SHFileOperation(FileOp);

有没有那么设置 TSHFILEOpStruct 来完成这个?

另外,我使用的是 Delphi 2007,我无法访问 MSDN 文档中提到的所有标志(例如 FOF_NORECURSION)

为方便起见,如果需要,这里是上述文档的链接... http://msdn.microsoft.com/en-us/library/windows/desktop/bb762164(v=vs.85).aspx

【问题讨论】:

    标签: delphi winapi


    【解决方案1】:

    您告诉它删除文件夹本身,所以它会。要仅删除文件夹内的文件,您需要使用文件名通配符掩码,例如:

    FileOp.pFrom := PChar(DirName+'\*.*'#0);
    

    【讨论】:

    • +1 击败了我。更好的是使用最简单的通配符:PChar(DirName+'\*'#0)
    • 我在文档中读到了这一点,并认为这是我必须做的,但不完全确定如何实现它。这正是我所需要的,一个明显的例子。谢谢 Remy Lebeau (Gambit) 和 David Heffernan。
    • 如果有人对*.** 之间的区别感兴趣,那就没有了:blogs.msdn.com/b/oldnewthing/archive/2007/12/17/6785519.aspx
    • FOF_FILESONLY 标志的文档明确指出 *.* 而不是 ** 在这种情况下是否有效是一个实现细节。我在谨慎方面犯了错误,并展示了文档所说的使用内容。
    • @RemyLebeau 编写文档的人可能不知道他们在说什么。但鉴于这就是它所说的,我想你是对的。
    猜你喜欢
    • 2015-03-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2016-08-22
    • 1970-01-01
    相关资源
    最近更新 更多