【问题标题】:How can I delay file deletion until next reboot from my program?如何将文件删除延迟到下一次从我的程序重新启动?
【发布时间】:2011-03-30 18:39:20
【问题描述】:

我的应用程序需要删除一些文件,但这应该会在下次 Windows 启动之前发生。

我现在正在做的是将这个字符串值写入 RunOnce 注册表项:

Command.com /c del c:\some file.ext

但我发现带有嵌入空格的路径存在问题。我不得不说我也试过这个:

Command.com /c del "c:\some file.ext"

但这并没有解决问题,反而让问题变得更糟:不删除任何文件,不管嵌入的空格如何!

从我的程序中删除延迟到下次重新启动的文件的正确方法是什么?

谢谢。

【问题讨论】:

  • 这是什么版本的windows?这是 cmd.exe 的东西,还是 XP 之前的东西?
  • @Armin: 那么没有command.comcommand.com 在 Windows 9x 中使用!从 Windows XP 开始,我们改用cmd.exe
  • @Armin,这不像程序员的问题......我不知道你为什么标记这个 Delphi,但对我来说这属于超级用户。如果您认为这确实属于 SO(如 FAQ 中所定义,请编辑您的问题以避免迁移。
  • @jachguate,阅读第一句话:我的 应用程序 需要在 Windows 启动时删除一些文件”。对我来说,这意味着应用程序正在写入 RunOnce 注册表项,并且这意味着这是一个编程问题。
  • @Armin:您的请求完全有效。令人困惑的是您的问题的措辞,特别是因为您将问题标记为delphi,但从未提及您的问题与 Delphi 的关系(事实证明这是您问题中最重要的部分)。因此,在学习 Delphi 的同时,也要注意学习如何提问。 :)

标签: delphi delphi-7


【解决方案1】:

不要使用RunOnce,也不要使用Command.com。如果您坚持使用某些东西,请改用%COMSPEC% /c。不过,您有更好的选择。

MoveFileExMOVEFILE_DELAY_UNTIL_REBOOT 标志一起使用:

if not MoveFileEx(PChar(YourFileToDelete), nil, MOVEFILE_DELAY_UNTIL_REBOOT) then
  SysErrorMessage(GetLastError);

【讨论】:

  • 哇。从这个答案中学到了很多东西。 +10。你超出了我的每日学习配额(相当低)。我明天必须跳过它:)
  • 谢谢。这是一篇非常有用的文章。但还有 3 个问题:(1)我使用 RunOnce 键,因为文件可能与某些程序或进程一起使用,并且在 RunOnce 键中它将在此之前被删除。你的方法一样吗? (2)文件和文件夹之间有什么区别?也许我有没有扩展名的文件和同名的文件夹! (3) 当我使用 RunOnce 键时,当我输入许多字符串值时,它只删除了其中一些,我删除了 /c 开关,我看到了这个错误:“参数太多”。你的方式也有这个问题吗?
  • Armin,(1) 该问题无法解析。请改写。 (2) 文件和文件夹共享一个命名空间。不可能有同名的文件和文件夹。 (3) 每个要删除的文件都单独存储在操作系统选择存储该信息的任何位置,因此您无需担心一次尝试删除太多文件。
  • @Armin: 1) MoveFileEx 如我所述在启动时删除文件。 2)如果您要删除文件,它在文件夹中,对吗?如果你可以用RunOnce 做到这一点,你可以用MoveFileEx 做到(更好)。 3)您通过多次调用MoveFileEx来执行多个文件;他们一个接一个地被处决。它在我链接的文章中。
  • @se_pavel:对不起。恐怕我对此无能为力。对我发表评论不会改变它。 :-) 上面还有一条带有粗体 注意事项 的评论,表示需要管理员权限。请在添加任何其他 cmets 之前阅读其他 cmets,因为这在之前已讨论过(事实上,RunOnce 由于 UAC 在 Vista 及更高版本下也需要管理员权限)。
【解决方案2】:

请改用 cmd.exe。这是自 Windows NT 以来的“新”命令提示符。

cmd.exe /c del "c:\some file.ext"

【讨论】:

  • 用户可以在几秒钟内看到 cmd 窗口
  • 您也可以使用 8.3 文件名并避免使用引号
  • @se_pavel 8.3?严重地?呃。
  • 我尝试了两种变体 cmd+del 和 MOVE_UNTIL_DELAY 都不是我需要的,然后我决定通过 WINAPI 创建计划任务(stackoverflow.com/questions/14988449/… 其他问题),然后我决定创建计划具有以下行的任务 Schtasks.exe /TR "cmd /c del /q
【解决方案3】:

只是一个猜测:看起来您正在运行仅适用于短文件名的“DOS”command.com。如果您使用的是 Win2K 及更高版本,请使用 cmd.exe 而不是 command.com,是的,请使用双引号。

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多