【问题标题】:SHFileOperation Delete when pFrom = ""SHFileOperation 当 pFrom = "" 时删除
【发布时间】:2012-06-07 01:32:27
【问题描述】:

我有一个涉及 SHFileOperation 的问题:

    SHFILEOPSTRUCT sf2;
    memset(&sf2,0,sizeof(sf2));
    sf2.hwnd = NULL;
    sf2.wFunc = FO_DELETE;
    sf2.fFlags = FOF_NOCONFIRMATION;
    sf2.pFrom = pathSubDir; // where pathSubDir = ""

    //2. Delete temporary files
    int n = SHFileOperation(&sf2);

我的期望是,由于 pathSubDir 是“”,它不会删除任何内容,并且我应该得到 n 不等于 0。但是,事实并非如此。我最终得到了 n = 0,这意味着操作已成功完成。我很好奇是否有人可以向我解释为什么我的假设是错误的。谢谢。

【问题讨论】:

  • “什么都不删除”的操作怎么会失败?
  • 这样的情况对于 API 设计人员来说真的很难在任何情况下都做正确的事情。有人必须决定:如果用户什么都不删除,我会出错(毕竟,什么都没有被删除,所以从技术上讲它被删除了)。同样,如果调用者要求删除“foo.bar”,但没有“foo.bar”,那是成功还是失败? IMX,Delete() 函数通常在其输入已被删除时更好地假设成功。这意味着函数的客户端需要更少的检查,更多的是由最终用户来选择他们想要删除的内容。

标签: c++ shfileoperation


【解决方案1】:

API 要求 pFrom 以双空结尾。像"" 这样的简单空字符串不符合条件。 API 可以读取第一个空字符之后的任何内存并成功删除这些文件。

另一种解释,如果你的字符串格式真的正确,API 已经成功删除了所有请求的文件,并且一路上没有遇到任何故障。它完成了您要求的所有删除操作,因此返回成功。

【讨论】:

  • 你能写一些简单的示例字符串格式吗? "C:\SomeFolder\SomeTXT.txt" 这是正确的吗?
  • 不,这不正确,@Sasha。如果"" 不是双空终止的,正如我在回答中所说的那样,那么将其他非空字符放入其中就不会突然出现。如果您希望 C 字符串末尾的空字符数超过默认数量(即 1),那么您需要自己将它们放在那里。请咨询the question about creating double-null-terminated strings
猜你喜欢
  • 2015-03-01
  • 2017-10-16
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多