给定一个字符串 "filename.conf"
,我如何验证扩展部分?
我需要一个跨平台的解决方案。
原文由 JeffV 发布,翻译遵循 CC BY-SA 4.0 许可协议
给定一个字符串 "filename.conf"
,我如何验证扩展部分?
我需要一个跨平台的解决方案。
原文由 JeffV 发布,翻译遵循 CC BY-SA 4.0 许可协议
因此, 使用 std::filesystem
是最好的答案,但是如果由于某种原因您没有可用的 C++17 功能,即使输入字符串包含目录,这也将起作用:
string getextn (const string &fn) {
int sep = fn.find_last_of(".\\/");
return (sep >= 0 && fn[sep] == '.') ? fn.substr(sep) : "";
}
我之所以添加这个,是因为如果文件的路径包含点而文件不包含,则此处的其余答案要么异常复杂,要么失败。我认为 find_last_of
可以查找多个字符这一事实经常被忽视。
它适用于 /
和 \
路径分隔符。如果扩展本身包含斜杠,它会失败,但这通常太罕见了。它不会对以点开头且不包含其他点的文件名进行任何过滤 - 如果这对您很重要,那么 这 是这里最不合理的答案。
/ => ''
./ => ''
./pathname/ => ''
./path.name/ => ''
pathname/ => ''
path.name/ => ''
c:\path.name\ => ''
/. => '.'
./. => '.'
./pathname/. => '.'
./path.name/. => '.'
pathname/. => '.'
path.name/. => '.'
c:\path.name\. => '.'
/.git_ignore => '.git_ignore'
./.git_ignore => '.git_ignore'
./pathname/.git_ignore => '.git_ignore'
./path.name/.git_ignore => '.git_ignore'
pathname/.git_ignore => '.git_ignore'
path.name/.git_ignore => '.git_ignore'
c:\path.name\.git_ignore => '.git_ignore'
/filename => ''
./filename => ''
./pathname/filename => ''
./path.name/filename => ''
pathname/filename => ''
path.name/filename => ''
c:\path.name\filename => ''
/filename. => '.'
./filename. => '.'
./pathname/filename. => '.'
./path.name/filename. => '.'
pathname/filename. => '.'
path.name/filename. => '.'
c:\path.name\filename. => '.'
/filename.tar => '.tar'
./filename.tar => '.tar'
./pathname/filename.tar => '.tar'
./path.name/filename.tar => '.tar'
pathname/filename.tar => '.tar'
path.name/filename.tar => '.tar'
c:\path.name\filename.tar => '.tar'
/filename.tar.gz => '.gz'
./filename.tar.gz => '.gz'
./pathname/filename.tar.gz => '.gz'
./path.name/filename.tar.gz => '.gz'
pathname/filename.tar.gz => '.gz'
path.name/filename.tar.gz => '.gz'
c:\path.name\filename.tar.gz => '.gz'
原文由 Jason C 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.3k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.5k 阅读
1 回答2.7k 阅读✓ 已解决
3 回答525 阅读✓ 已解决
您必须确保处理多于一个点的文件名。例如:
c:\.directoryname\file.name.with.too.many.dots.ext
不会被strchr
或find.
正确处理我最喜欢的是具有扩展(路径)功能的 boost 文件系统库