Хотя вы можете искать имена файлов, а затем вызывать DeleteFile
для каждого из них по отдельности, я бы посоветовал использовать вместо этого одну из функций оболочки Windows.
Например, вы можете использовать код, подобный следующему:
#define _WIN32_IE 0x500
#include <windows.h>
#include <shellapi.h>
#include <shlobj.h>
#include <iostream>
#include <string>
static char const *full_path(std::string const &p) {
static char path[MAX_PATH+2] = {0};
char *ignore;
GetFullPathName(p.c_str(), sizeof(path), path, &ignore);
return path;
}
static int shell_delete(std::string const &name) {
SHFILEOPSTRUCT op = { 0 };
op.wFunc = FO_DELETE;
op.pFrom = full_path(name);
op.fFlags = FOF_ALLOWUNDO | FOF_SILENT | FOF_WANTNUKEWARNING | FOF_NOCONFIRMATION;
return !SHFileOperation(&op);
}
int main(int argc, char **argv) {
if ( argc < 2) {
fprintf(stderr, "Usage: delete <filename> [filename ...]");
return 1;
}
for (int i=1; i<argc; i++)
shell_delete(argv[i]);
}
Одним из очевидных преимуществ этого является то, что вы можете передать флаг FOF_ALLOWUNDO
(как у меня есть в коде выше), который перемещаетфайлы в корзину вместо того, чтобы удалить ее навсегда.Конечно, вы можете опустить этот флаг, если хотите, чтобы файлы были обнулены.
В зависимости от того, что вы делаете, есть несколько других флагов, которые могут быть полезны, например FOF_FILESONLY
, для удаления толькофайлы, а не каталоги, которые могут соответствовать указанному подстановочному знаку, и FOF_NORECURSION
, чтобы он вообще не возвращался в подкаталоги.
Microsoft считает SHFileOperation
устаревшим и имеет (в Windows Vista, если память служит)«заменил» его на IFileOperation
.IFileOperation
- это интерфейс COM, поэтому, если вы не используете COM в другом месте своего кода, очень велики шансы, что его использование добавит изрядное количество дополнительной работы для (по крайней мере, в этом случае) небольшого или никакого реального преимущества.Тем более, что вы уже используете COM, однако, возможно, стоит подумать.