假如给你一个文件路径,你可以将其中的文件名和文件后缀提取出来嘛?
不会没有关系,此篇博客提供一个函数,即可在Windows环境下调用,也可以在Linux环境下调用,去获取一个文件路径的文件名和文件后缀!
一、返回值 bool 版
需要包含头文件:
#include
#include
#include
代码如下:
/******************************************************************************
*
* 功能:
* 获得 (文件名.后缀) 和 (文件名) 和 (文件后缀),Windows和Linux通用!
*
* 参数:
* _filePaht:C语言字符指针,文件路径字符串
* _fileName:C++字符串引用,获得[(文件名.后缀)|(文件名)]返回
* _fileName:C++字符串引用,获得(文件名.后缀)返回
* _fileSuffix:C++字符串引用,获得(后缀)返回
* _dot:true,后缀带点(.txt);false,后缀不带点(txt);默认值为true
*
* 返回值:
* 成功返回true,失败返回false
*
******************************************************************************/
bool get_fileName_fileSuffix(const char *_filePaht, std::string &_fileNames, std::string &_fileName, std::string &_fileSuffix, bool _dot = true) {
// 合法性检查
if (!_filePaht) return false;
std::string str = _filePaht;
if (str.empty()) return false;
// .txt 的情况
if (str.at(0) == '.') return false;
// file. 的情况
if (str.at(str.size() - 1) == '.') return false;
char c = ';'// 区分此函数是在Windows环境调用还是Linux环境调用
#
ifdefined ( )_WIN64|| defined ( )WIN32|| defined ( )_WIN32//printf("---Windows---\n");
=
c '\' ;#
else//printf("---Linux---\n");
=
c '\/' ;#
endif// 去除字符串中的路径,剩下文件名
::
std=string filename strrchr (,_filePaht) c== NULL ? "" : strrchr (,_filePaht) c+ 1 ;if
( ==filename "" )/* 说明字符串是file.txt或者file形式 */ {
=
filename ; _filePaht}
else /* 说名字符串是C:\abc\file.txt或者C:\abc\file形式 */ {
}
// 找到 . 的位置
=
size_t _size . filenamerfind(".");// 获得文件名,不包含后缀
=
_fileName . filenamesubstr(0,) _size;// 获得文件后缀
::
std=string strsuffix "" ;if
( !=_size - 1)// 不等于-1说明有后缀 file.txt形式 { // true后缀带点,false后缀不带点
if
( ==_dot true )= {
strsuffix . filenamesubstr()_size;// 文件后缀 .txt }
else = {
strsuffix . filenamesubstr(+_size 1 );// 文件后缀 txt }
}
// 后缀
=
_fileSuffix ; strsuffix// 获得文件名.后缀(file.txt | file)
=
_fileNames ; filenamereturn
true ;}
int
具体过程就不解释了,都有详细注释,去看,去理解吧。
-
测试Windows路径:
C:\abc\file.txt
C:\abc\file
file.txt
filemain (void)// C:\abc\file.txt { // C:\abc\file // file.txt // file :: std=string fileNames "" ;:: std=string fileName "" ;:: std=string fileSuffix "" ;bool = suffix true ;bool = flag false ;//printf("---Windows---\n"); = flag get_fileName_fileSuffix ("C:\abc\file.txt",, fileNames, fileName, fileSuffix) suffix;printf ("str = %s, fileNames = %s fileName = %s fileSuffix = %s flag = %d\n\n","C:\abc\file.txt" ,. fileNamesc_str(),. fileNamec_str(),. fileSuffixc_str(),) flag;= flag get_fileName_fileSuffix ("C:\abc\file",, fileNames, fileName, fileSuffix) suffix;printf ("str = %s, fileNames = %s fileName = %s fileSuffix = %s flag = %d\n\n","C:\abc\file" ,. fileNamesc_str(),. fileNamec_str(),. fileSuffixc_str(),) flag;= flag get_fileName_fileSuffix ("file.txt",, fileNames, fileName, fileSuffix) suffix;printf ("str = %s, fileNames = %s fileName = %s fileSuffix = %s flag = %d\n\n","file.txt" ,. fileNamesc_str(),. fileNamec_str(),. fileSuffixc_str(),) flag;= flag get_fileName_fileSuffix ("file",, fileNames, fileName, fileSuffix) suffix;printf ("str = %s, fileNames = %s fileName = %s fileSuffix = %s flag = %d\n\n","file" ,. fileNamesc_str(),. fileNamec_str(),. fileSuffixc_str(),) flag;= fileNames "" ;= fileName "" ;= fileSuffix "" ;= flag get_fileName_fileSuffix ("",, fileNames, fileName, fileSuffix) suffix;printf ("str = %s, fileNames = %s fileName = %s fileSuffix = %s flag = %d\n\n","\"\"" ,. fileNamesc_str(),. fileNamec_str(),. fileSuffixc_str(),) flag;return 0 ;} int
运行截图:
这个是后缀带点(.txt)的测试
-
测试Linux路径:
/abc/file.txt
/abc/file
file.txt
filemain (void):: { std=string fileNames "" ;:: std=string fileName "" ;:: std=string fileSuffix "" ;bool = suffix false ;bool = flag false ;// /abc/file.txt // /abc/file // /file.txt // file //printf("---Linux---\n"); = flag get_fileName_fileSuffix ("/abc/file.txt",, fileNames, fileName, fileSuffix) suffix;printf ("str = %s, fileNames = %s fileName = %s fileSuffix = %s flag = %d\n\n","/abc/file.txt" ,. fileNamesc_str(),. fileNamec_str(),. fileSuffixc_str(),) flag;= flag get_fileName_fileSuffix ("/abc/file",, fileNames, fileName, fileSuffix) suffix;printf ("str = %s, fileNames = %s fileName = %s fileSuffix = %s flag = %d\n\n","/abc/file" ,. fileNamesc_str(),. fileNamec_str(),. fileSuffixc_str(),) flag;= flag get_fileName_fileSuffix ("file.txt",, fileNames, fileName, fileSuffix) suffix;printf ("str = %s, fileNames = %s fileName = %s fileSuffix = %s flag = %d\n\n","/file.txt" ,. fileNamesc_str(),. fileNamec_str(),. fileSuffixc_str(),) flag;= flag get_fileName_fileSuffix ("file",, fileNames, fileName, fileSuffix) suffix;printf ("str = %s, fileNames = %s fileName = %s fileSuffix = %s flag = %d\n\n","/file" ,. fileNamesc_str(),. fileNamec_str(),. fileSuffixc_str(),) flag;return 0 ;} /****************************************************************************** * * 功能: * 获得 (文件名.后缀) 和 (文件名) 和 (文件后缀),Windows和Linux通用! * * 参数: * _filePaht: C语言字符指针,文件路径字符串 * _fullFileName: C++字符串引用,获得[(文件名.后缀) 或 (文件名)]返回 * _fileName: C++字符串引用,获得(文件名.后缀)返回 * _fileSuffix: C++字符串引用,获得(后缀)返回 * _dot: true,后缀带点(.txt);false,后缀不带点(txt);默认值为true * * 返回值: * 有后缀返回"."的索引;没有后缀则返回-1 * ******************************************************************************/
运行截图:
这个是后缀不带点(txt)的测试
二、返回值 后缀索引 版
第一个版本是两个星期前写好的,后续回来看后,觉得返回值好像不是太友好,于是乎更改了以下版本代码。
返回的是 后缀索引 。
处理过程不变!
需要包含头文件:
#include
#include
#include
int
get_fileName_fileSuffix (constchar * ,_filePaht:: std&string ,_fullFileName:: std&string ,_fileName:: std&string ,_fileSuffixbool = _dot true )// 合法性检查 {
if
( !)_filePahtreturn - 1;::
std=string str ; _filePahtif
( .strempty())return - 1;// .txt 的情况
if
( .strat(0)== '.' )return - 1;// file. 的情况
if
( .strat(.strsize()- 1 )== '.' )return - 1;char
= c ';' // 区分此函数是在Windows环境调用还是Linux环境调用#
if
defined( ) ||_WIN64defined ( ) ||WIN32defined ( ) //printf("---Windows---\n");_WIN32=
'\'
c ; #else
//printf("---Linux---\n");=
'\/'
c ; #endif
// 去除字符串中的路径,剩下文件名::
=
stdstrrchrstring filename ( ,)_filePaht== cNULL ? "" : strrchr ( ,)_filePaht+ c1 ; if(
== ""filename ) /* 说明字符串是file.txt或者file形式 */= {
;
filename } _filePahtelse
/* 说名字符串是C:\abc\file.txt或者C:\abc\file形式 */ } {
// 找到 . 的位置
=
.
size_t _size rfind filename(".");// 获得文件名,不包含后缀=
.
_fileName substr filename(0,); _size// 获得文件后缀::
=
std""string strsuffix ; if(
!= -_size 1 )// 不等于-1说明有后缀 file.txt形式// true后缀带点,false后缀不带点 { if
(
== true_dot ) =. {
strsuffix substr filename();_size// 文件后缀 .txt} else
= . {
strsuffix substr filename(+1_size ) ;// 文件后缀 txt} }
// 后缀
=
;
_fileSuffix // 获得文件名.后缀(file.txt | file) strsuffix=
;
_fullFileName return filename;
} _sizeint
main
测试:
( void)::= {
std"abc.jpg"string str ; //std::string str = ".abcjpg";//std::string str = "abcjpg.";
::
,
std,string fullFilename; filenameint fileSuffix=
get_fileName_fileSuffix r ( .c_strstr(),,, fullFilename, filenametrue fileSuffix) ;printf(
"r = %d\n",); rprintf(
"fullFilename = %s filename = %s fileSuffix = %s\n",.c_str fullFilename(),.c_str filename(),.c_str fileSuffix());return0
; }
运行截图:
总结
本人在做项目时经常需要在一个路径中提取出文件名和文件路径,但是在项目中写的是零散的代码,所以在这里总结成一个函数,通过这个函数去获取就方便多了,而且windows和linux通用!(废了两个三个小时写代码、测试和写博客,值得!)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)