确保字符串(用户输入)是有效文本文件路径的最合适方法是什么?扩展部分也应该是 .txt 或空。
我考虑过两种方法:
const std::string_view filename {"setup"};
// Check if the filename is valid
std::error_code ec;
if (!std::filesystem::path(filename).has_filename() || !std::filesystem::exists(filename, ec) ||
std::filesystem::path(filename).extension() != "" && std::filesystem::path(filename).extension() != ".txt")
{
return false;
}
或:
const std::string_view filename {"setup"};
// Check if the filename is valid
if (std::filesystem::path(filename).extension() != "" && std::filesystem::path(filename).extension() != ".txt")
{
return false;
}
std::istream ifs { filename };
if (!ifs.is_open()) // or if (!ifs) or if (ifs.fail())
{
return false;
}
我必须提到
exists()
不是我想要的,因为我宁愿使用 ifstream
直接打开文件进行读取操作(而不是先检查它是否存在)。
is_regular_file()
的函数,我想我需要将其添加到上述检查中。
第二种方法是否足以处理任何潜在的错误(例如,用户输入中使用的无效字符、错误的扩展名、文件未打开、错误的文件类型等)?
文件可能存在,但您无法判断(是否以编程方式),因为您(或可执行文件)只是缺乏适当的权限。
std::filesystem::exists 是检查存在性的最佳选择。至于检查扩展名,std::filesystem::path::extension是一个很好的起点。
我宁愿使用
直接打开文件进行读取操作(而不是先检查它是否存在)。ifstream
你一定可以尝试一下。在尝试从中读取任何内容之前,请确保该流有效。您的
!ifs
样本是我个人的偏好;该流具有隐式布尔转换,如果无效则返回 false
。
注意一点:您应该避免重复拨打
std::filesystem::path(filename)
。这每次都会构造一个新的 path
实例。构建一个,然后根据需要对其进行询问。