c++ - 在 C++ 中删除文件
问题描述
我最近刚接触 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 和标准 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
推荐阅读
- android - 将 OpenGL 片段着色器设置为仅通过漫反射减少 vec4 色点的 RGB 值,而不是 alpha
- asp.net - ASP.Net 1.1 防止配置不工作的 Cookieless 会话 XSS 攻击
- javascript - 无法在 TypeScript 中访问 redux 状态对象的键
- spring-boot - 返回“错误请求”但需要“未找到”
- javascript - Why is amplitude sdk regenerating device Id on every session/tab on the web on desktop?
- java - 实体中的布尔字段更改 JSON 中的名称
- python - 如何在 Pandas 中跨列进行 COUNTIFS
- c - 在 c-segmentation 错误中使用指针指向变量
- stream - Web2Py 如何使用 response.stream 下载多个文件
- python-3.x - 如何使用 python 从 .mp3 文件中获取横幅艺术、艺术家姓名和歌曲名称?