【发布时间】: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。