如果涉及外卡,我可以使用此功能删除文件 我在c ++ builder 6中创建了一个使用命令读取文件的应用程序 然后执行它们的问题是,当我放置一个不同的目录时,该函数会读取并删除带有命令的文件 例 该文件是hola.txt
当我执行ofstream(" hola2.txt")或ofstream(" C:\ path \ hola3.txt")时,它在删除时工作正常 我使用删除(" hola.txt")它可以工作,但我不能使用通配符 如果我做WildDeleteFiles(" * .txt") 它会删除应用程序文件夹中的每个txt文件 但是当我执行WildDeleteFiles(" C:\ path * .txt")时,不删除该目录中的txt文件,而只删除带有命令的txt文件 这是函数
void WildDeleteFiles(const char* direcc)
{
WIN32_FIND_DATA fd;
HANDLE hFind;
hFind = FindFirstFile(direcc, &fd);
if (hFind == INVALID_HANDLE_VALUE)
{
ShowMessage("No files found!");
}
else
{
do
{
DeleteFile(fd.cFileName);
}
while (FindNextFile(hFind, &fd));
ShowMessage("Files deleted!");
cmpi++;
rfi = 1;
}
}
这就是以后调用它的方式:
void __fastcall TForm1::Image4Click(TObject *Sender)
{
WildDeleteFiles(TStrings1->Cells[1][0].c_str());
}
我做错了什么?
答案 0 :(得分:2)
两件事:
FindFirstFile()
/ FindNextFile()
完全按照其记录的方式执行,特别是它不会对文件进行任何递归搜索。如果您需要,可以自己实现它,也可以使用SHFileOperation()
之类的shell函数。无论如何,搜索“Windows C ++删除文件树”应该会给你提供一堆提示。答案 1 :(得分:0)
WIN32_FIND_DATA::cFileName
字段仅包含找到的文件名,而不是文件的完整路径。因此,您将相对文件名传递给受调用进程当前工作目录影响的DeleteFile()
。这就是您在删除正确文件夹中的文件时遇到问题的原因。您需要将完整路径传递到DeleteFile()
以避免这种情况。
尝试更像这样的事情:
void WildDeleteFiles(const String &direcc)
{
WIN32_FIND_DATA fd;
HANDLE hFind;
hFind = FindFirstFile(direcc.c_str(), &fd);
if (hFind == INVALID_HANDLE_VALUE)
{
if (GetLastError() == ERROR_FILE_NOT_FOUND)
ShowMessage("No files found!");
else
ShowMessage("Error finding files!");
}
else
{
String path = ExtractFilePath(direcc);
do
{
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
DeleteFile(path + fd.cFileName);
}
while (FindNextFile(hFind, &fd));
DWORD dwErr = GetLastError();
FindClose(hFind);
if (dwErr == ERROR_NO_MORE_FILES)
ShowMessage("Files deleted!");
else
ShowMessage("Error finding files!");
cmpi++;
rfi = 1;
}
}
void __fastcall TForm1::Image4Click(TObject *Sender)
{
WildDeleteFiles(TStrings1->Cells[1][0]);
}