如何确保字符串是有效的文件名/路径?

问题描述 投票:0回答:1

确保字符串(用户输入)是有效文本文件路径的最合适方法是什么?扩展部分也应该是 .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()
的函数,我想我需要将其添加到上述检查中。

第二种方法是否足以处理任何潜在的错误(例如,用户输入中使用的无效字符、错误的扩展名、文件未打开、错误的文件类型等)?

c++ error-handling filesystems filenames
1个回答
0
投票

文件可能存在,但您无法判断(是否以编程方式),因为您(或可执行文件)只是缺乏适当的权限。

std::filesystem::exists 是检查存在性的最佳选择。至于检查扩展名,std::filesystem::path::extension是一个很好的起点。

我宁愿使用

ifstream
直接打开文件进行读取操作(而不是先检查它是否存在)。

你一定可以尝试一下。在尝试从中读取任何内容之前,请确保该流有效。您的

!ifs
样本是我个人的偏好;该流具有隐式布尔转换,如果无效则返回
false

注意一点:您应该避免重复拨打

std::filesystem::path(filename)
。这每次都会构造一个新的
path
实例。构建一个,然后根据需要对其进行询问。

© www.soinside.com 2019 - 2024. All rights reserved.