【问题标题】:C++ Win32 API Delete file with progress barC++ Win32 API 删除带有进度条的文件
【发布时间】:2011-06-14 05:11:47
【问题描述】:

使用 windows api,有没有办法删除一个大文件(比如说 1gb+),并以某种方式监控进度?我确信它可能,但我不知道从哪里开始..

编辑:应该更具体,我想将文件移动到回收站,并显示类似于探索的进度条,但我可能想要控制台或其他东西中的进度条,所以我不想要精确复制品。

编辑 2:是的,我猜它是即时的,应该在我问这个问题之前进行测试。 无论如何要关闭这个问题?

【问题讨论】:

  • 你是真的删除它,还是把它移到回收站?您是否尝试显示与一个资源管理器显示的删除相同的进度条?
  • 删除文件的进度条是什么意思?这是一个不依赖于文件大小的操作。
  • 当您说删除时,您的意思是安全擦除吗?删除 1Gb+ 文件不会比删除 1Kb 文件花费更长的时间,因为文件中的大部分数据都没有被 DeleteFile() 触及...您实际上只是在更改元数据。
  • 重新编辑 - 移动到回收站再次是一个不依赖于文件大小的操作,它是在硬盘驱动器内移动 - 只是重新连接到另一个目录。

标签: c++ file api winapi delete-file


【解决方案1】:

使用SHFileOperationFO_DELETE 函数和FOF_ALLOWUNDO 标志将文件移动到回收站。除非您还指定 FOF_SILENT,否则将自动显示进度。

SHFILEOPSTRUCT fileop = { 0 };
fileop.hwnd = hwndMain; /* your window */
fileop.wFunc = FO_DELETE;
fileop.pFrom = szFilePathToDelete;
fileop.fFlags = FOF_ALLOWUNDO /* | FOF_NOCONFIRMATION to recycle without prompting */;
int error = SHFileOperation(&fileop);

更新:如问题编辑中所述,不会显示单个文件的进度,但如果回收整个目录则会显示进度。这也不允许您覆盖 UI(例如,在控制台窗口中显示进度)。

【讨论】:

    【解决方案2】:

    也许您可以使用 SetEndOfFile 逐步截断它? http://msdn.microsoft.com/en-us/library/aa365531(v=vs.85).aspx。然后可以快速完成删除 inode(或在 Windows 领域中调用的任何内容)。

    [更新]刚刚测试过;其他人是对的。删除 inode(删除)在 1gb 文件上是即时的。

    【讨论】:

      猜你喜欢
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多