问题在C ++ Builder 6中使用通配符删除文档

时间:2015-05-31 20:44:01

标签: c++ winapi c++builder

如果涉及外卡,我可以使用此功能删除文件 我在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());
}

我做错了什么?

2 个答案:

答案 0 :(得分:2)

两件事:

  • 首先,您使用的IDE非常过时,今天您将无法获得太多支持。你一定要升级。
  • 其次,你几乎不检查任何错误,这是不好的。如果您单步执行代码并检查文档,您还会发现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]);
}