【问题标题】:Deleting a file in C++ [duplicate]在 C++ 中删除文件 [重复]
【发布时间】:2020-03-20 16:30:55
【问题描述】:

我最近刚接触 C++,我想做一些简单的开始。我制作了一个控制台程序,询问用户文件路径,然后删除该文件。但是,我遇到了一个我似乎无法解决或找不到解决方案的问题。声明 DeleteFile(filePath.c_str()); 给了我 2 个错误:

“const char*”类型的参数与“LPCWSTR”类型的参数不兼容

'BOOL DeleteFileW(LPCWSTR)':无法将参数 1 从 'const_Elem*' 转换为 'LPCWSTR'

首先,我需要将std::string 转换为LPCWSTR,所以我在最后添加了c_str(),这给了我这两个错误。

我仍然是 C++ 的菜鸟,所以请放轻松。

#include <iostream>
#include <string>
#include <Windows.h>
#include <fstream>

int main() 
{
    loop:
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    std::string filePath;
    SetConsoleTextAttribute(h,15);
    std::cout << "\nEnter the path of the file you'd like to remove: ";

    if (!std::getline(std::cin, filePath)) { std::cout << "I/O error!"; }

    while (true)
    {
        if (!filePath.empty())
        {
            SetConsoleTextAttribute(h,15);
            std::cout << "[+] Checking if file exists";
            std::ifstream ifile(filePath);
            if (ifile) 
            {
                std::cout << "\n[!] File exists!";
                std::cout << "\n[#] Deleting file";
                DeleteFile(filePath);
                std::ifstream ifile(filePath);
                if (!ifile) 
                {
                    std::cout << "\n[!] File deleted successfully!";
                }
                else 
                {
                    SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
                    std::cout << "\n[!] Failed to delete file";
                }
                goto loop;
            }
            else 
            {
                SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
                std::cout << "\nPlease enter a valid file path!";
                goto loop;
            }

            break;
        }
        else
        {
            SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
            std::cout << "Please enter a valid file path!";
            goto loop;
        }
    }
    std::cout << "\nFile deleted!";
}

【问题讨论】:

  • 如果您仅在一个操作系统上编译(您的情况是 Windows?),请在问题中包含信息并添加相应的标签。不同的操作系统有不同的文件系统 API。
  • DeleteFile 函数接受const wchar_t *const char * 的参数,具体取决于您的项目是否配置为使用Unicode。如果您选择了 Unicode,您应该将您的 std::string 更改为 std::wstring,或使用显式的 DeleteFileA 函数(始终使用 const char *)。
  • 另外,即使你只是在学习......或者更确切地说,特别是因为你只是在学习:不要使用goto!我想它有它的位置(在有例外的 C++ 中较少),但不要养成像这样使用它的习惯!编译器不会警告你吗?尝试提高警告级别.../W4 在您学习时可能会很好。
  • 如果您“最近接触到 C++”,那么您应该使用一本好的 C++ 书籍。有许多 C++ 主题和技能需要学习——类、方法、多重和虚拟继承、模板、容器、执行线程等等——比学习如何实现基本操作更重要的是要彻底理解系统特定的任务。不要偏离轨道,而是继续阅读并遵循您的 C++ 书籍。你有很多东西要学,哦,3-5 年左右,然后用完材料并继续学习这些东西......
  • 是的,你做到了!声明/构造函数调用std::ifstream ifile(filePath); 打开文件(如果存在)。见here

标签: c++ winapi


【解决方案1】:

您混合了本机 Windows 和标准 C 风格的系统调用,这是问题的一部分。 C 函数通常采用 const char* 指针,而本机 Windows 调用使用 16 位字符(尽管您可以为您的编译器切换它)。

您可以使用常规的 C remove() 调用来删除文件,或者使用带有 8 位字符的 Windows 调用 DeleteFileA

在这个阶段将字符串从 8 位正确转换为 16 位可能比您需要的更令人头疼...

https://en.cppreference.com/w/c/io/remove

https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-deletefilea

【讨论】:

    【解决方案2】:

    跨平台版本

    C++17 的标准库包括来自boostfilesystem 库,它适用于大多数常规操作系统(MacOS、Linux、Windows)。所以我肯定会使用它而不是 Windows API。

    看看example of remove function

    【讨论】:

      【解决方案3】:

      根据您在 cmets 中的说法,您似乎正在编译程序的非 Unicode 版本。为 Unicode 编译并使用 std::wstring 而不是 std::string 或使用来自 stdio.hremove 函数

      看看here

      这是一个相当陈腐的话题。一些额外的阅读

      https://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc

      Convert char * to LPWSTR

      How to convert char* to LPCWSTR?

      【讨论】:

        猜你喜欢
        • 2021-07-28
        • 2011-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 2022-11-27
        相关资源
        最近更新 更多