С++ Win32 API Удалить файл с индикатором выполнения

Используя Windows API, есть ли способ удалить большой файл (скажем, 1 ГБ +) и как-то отслеживать прогресс? Я уверен, что это возможно, но я понятия не имею, с чего начать.

РЕДАКТИРОВАТЬ: Должен был быть более конкретным, я хочу переместить файл в корзину и показать индикатор выполнения, похожий на исследования, хотя мне может понадобиться индикатор выполнения в консоли или что-то в этом роде, поэтому мне не нужна точная копия.

РЕДАКТИРОВАТЬ 2: Да, думаю, это мгновенно, нужно было проверить, прежде чем я задал вопрос. В любом случае, чтобы просто закрыть этот вопрос?


person Josh    schedule 14.06.2011    source источник
comment
Вы действительно удаляете его или перемещаете в корзину? Вы пытаетесь показать индикатор выполнения, идентичный тому, который показывает проводник для удаления?   -  person Martyn Lovell    schedule 14.06.2011
comment
Что означает индикатор выполнения при удалении файла? Это операция, которая не зависит от размера файла.   -  person littleadv    schedule 14.06.2011
comment
Когда вы говорите удалить, вы имеете в виду безопасное стирание? Удаление файла размером более 1 ГБ занимает не больше времени, чем удаление файла размером 1 КБ, поскольку большая часть данных в файле не затрагивается DeleteFile()... на самом деле вы меняете только метаданные.   -  person Benj    schedule 14.06.2011
comment
Что касается редактирования - перемещение в корзину снова является операцией, не зависящей от размера файла, это перемещение внутри жесткого диска - просто повторное подключение к другому каталогу.   -  person littleadv    schedule 14.06.2011


Ответы (2)


Используйте SHFileOperation с флагом FO_DELETE func и 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);

Обновление: Как отмечено в редактировании вопроса, прогресс не будет отображаться для одного файла, но будет отображаться при перезапуске всего каталога. Это также не позволяет вам переопределить пользовательский интерфейс (например, для отображения прогресса в окне консоли).

person Bradley Grainger    schedule 14.06.2011

Возможно, вы могли бы постепенно обрезать его, используя SetEndOfFile? http://msdn.microsoft.com/en-us/library/aa365531(v=vs.85).aspx. Тогда можно было бы быстро удалить индексный дескриптор (или как там он называется в Windows-стране).

[обновление] Только что протестировано; остальные ребята правы. Удаление индекса (delete) выполняется мгновенно для файла размером 1 ГБ.

person jcomeau_ictx    schedule 14.06.2011