Skip to content

Commit 8957c1f

Browse files
committed
feat(util): 1.12.10, 添加GetFileStem()与GetFileSuffix()两个函数
1 parent f6ad8d7 commit 8957c1f

File tree

4 files changed

+74
-1
lines changed

4 files changed

+74
-1
lines changed

modules/util/fs.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,51 @@ std::string Dirname(const std::string &full_path)
440440
return full_path.substr(start_pos, end_pos - start_pos);
441441
}
442442

443+
/**
444+
* 目标:
445+
* "a" -> "a"
446+
* "a.txt" -> "a"
447+
* "/some/a.txt" -> "a"
448+
* "/some/a.b/c" -> "c"
449+
* "" -> ""
450+
*/
451+
std::string GetFileStem(const std::string &filepath)
452+
{
453+
std::string::size_type start_pos = 0;
454+
455+
auto last_backslash_pos = filepath.find_last_of('/');
456+
if (last_backslash_pos != std::string::npos)
457+
start_pos = last_backslash_pos + 1;
458+
459+
auto last_dot_pos = filepath.find_last_of('.');
460+
if (last_dot_pos != std::string::npos && last_dot_pos > start_pos)
461+
return filepath.substr(start_pos, last_dot_pos - start_pos);
462+
else
463+
return filepath.substr(start_pos);
464+
}
465+
466+
/**
467+
* 目标:
468+
* "a.b" -> "b"
469+
* "a" -> ""
470+
* "a." -> ""
471+
* "/w/a.b" -> "b"
472+
* "" -> ""
473+
*/
474+
std::string GetFileSuffix(const std::string &filepath)
475+
{
476+
auto last_dot_pos = filepath.find_last_of('.');
477+
if (last_dot_pos == std::string::npos)
478+
return "";
479+
480+
//! 防止 "a.b/c" -> "a/c" 的情况
481+
auto last_backslash_pos = filepath.find_last_of('/');
482+
if (last_backslash_pos != std::string::npos && last_backslash_pos > last_dot_pos)
483+
return "";
484+
485+
return filepath.substr(last_dot_pos + 1);
486+
}
487+
443488
bool Rename(const std::string &old_name, const std::string &new_name)
444489
{
445490
int ret = ::rename(old_name.c_str(), new_name.c_str());

modules/util/fs.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,16 @@ const char* Basename(const char *full_path);
275275
*/
276276
std::string Dirname(const std::string &full_path);
277277

278+
/**
279+
* 获取文件名的主体,如:"config.json" -> "config"
280+
*/
281+
std::string GetFileStem(const std::string &file_path);
282+
283+
/**
284+
* 获取文件名的后缀,如:"config.json" -> "json"
285+
*/
286+
std::string GetFileSuffix(const std::string &file_path);
287+
278288
/**
279289
* 重命名
280290
*

modules/util/fs_test.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,24 @@ TEST(fs, Basename) {
228228
EXPECT_EQ(Basename(std::string()), "");
229229
}
230230

231+
TEST(fs, GetFileStem) {
232+
EXPECT_EQ(GetFileStem("a.b"), "a");
233+
EXPECT_EQ(GetFileStem("a"), "a");
234+
EXPECT_EQ(GetFileStem("a."), "a");
235+
EXPECT_EQ(GetFileStem("/w/a.b"), "a");
236+
EXPECT_EQ(GetFileStem("/w.x/a"), "a");
237+
EXPECT_EQ(GetFileStem(""), "");
238+
}
239+
240+
TEST(fs, GetFileSuffix) {
241+
EXPECT_EQ(GetFileSuffix("a.b"), "b");
242+
EXPECT_EQ(GetFileSuffix("a"), "");
243+
EXPECT_EQ(GetFileSuffix("a."), "");
244+
EXPECT_EQ(GetFileSuffix("/w/a.b"), "b");
245+
EXPECT_EQ(GetFileSuffix("/w.x/a"), "");
246+
EXPECT_EQ(GetFileSuffix(""), "");
247+
}
248+
231249
TEST(fs, RemoveDirectory) {
232250
//! 绝对路径测试
233251
int ret = 0;

version.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@
2121
# TBOX版本号
2222
TBOX_VERSION_MAJOR := 1
2323
TBOX_VERSION_MINOR := 12
24-
TBOX_VERSION_REVISION := 9
24+
TBOX_VERSION_REVISION := 10

0 commit comments

Comments
 (0)