首页 > 解决方案 > 在 C++ 中删除文件

问题描述

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

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

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

首先,我需要转换std::stringLPCWSTR,所以我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!";
}

标签: c++winapi

解决方案


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

您可以使用常规 Cremove()调用来删除文件,也可以使用DeleteFileA采用 8 位字符的 Windows 调用。

正确地将字符串从 8 位转换为 16 位可能比现阶段需要的更令人头疼……

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

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


推荐阅读