【问题标题】:Issue Deleting documents using wildcards in C++ Builder 6在 C++ Builder 6 中使用通配符删除文档的问题
【发布时间】:2015-08-14 06:17:46
【问题描述】:

如果涉及通配符,我正在使用此功能删除文件 我在 c++ builder 6 中创建了一个应用程序,它使用命令读取文件 然后执行它们,问题是当我放置不同的目录时,函数会使用命令读取并删除文件 例子 该文件是 hola.txt

当我执行 ofstream("hola2.txt") 或 ofstream ("C:\path\hola3.txt") 时,删除时效果很好 我使用 remove("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());
}

我做错了什么?

【问题讨论】:

  • WTH 是 "c++ builder 6" 好吗??
  • 查看duckduckgo.com/?q=c%2B%2B+builder+6,@πάνταῥεῖ。
  • fd结构只保存文件名(无路径),需要添加路径信息才能正确删除文件。
  • 这不是 WhatsApp。请务必使用正确的标点符号。
  • 您没有像预期的那样致电FindClose。所以你有泄漏。

标签: c++ winapi c++builder


【解决方案1】:

两件事:

  • 首先,您使用的 IDE 已经过时了,而且您今天找不到太多支持。您绝对应该升级。
  • 其次,您几乎不检查任何错误,这是不好的。如果您单步执行代码并检查文档,您还会发现 FindFirstFile()/FindNextFile() 完全按照文档中的说明进行操作,特别是它不会对文件进行任何递归搜索。如果你想这样做,要么自己实现它,要么使用像SHFileOperation() 这样的shell 函数。在任何情况下,搜索“Windows C++ 删除文件树”应该会给您一些提示。

【讨论】:

  • 这感觉像是评论而不是答案。那么如果 IDE 太旧了怎么办。该代码在任何编译器中都可以正常工作(或不工作)。没有SHDeleteFile。告诉用户搜索网络对于发表评论来说是可以的,但并不能真正将其作为答案。我知道这个问题很弱,但这还不够。
【解决方案2】:

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]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多