我们经常会遇到需要获取文件名后缀的情形,例如:需要针对某路径下的所有文件的不同类型进行不同的处理,这是我们需要获取每个文件的后缀名。通常有以下做法:
①char * strrchr ( char * str, int character );查找字符在指定字符串中从后面开始的第一次出现的位置,如果成功,则返回指向该位置的指针,如果失败,则返回 false。
TCHARfileName[] = "c:/test//张信哲--白月光.mp3";
TCHAR* extention; extention = strrchr(fileName , '.') + 1;
既然说到这里,那就顺便提一下char * strchr ( char * str, int character )吧。与strrchr()相对应它查找字符串中首次出现指定字符的位置。
这是一种很常见的做法,很多人都是这么做的,不过也许会有别的方法。
②_splitpath,_wsplitpath
#include <stdlib.h> #include <stdio.h> void main( void ) { char path_buffer[_MAX_PATH]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; _makepath( path_buffer, "c", "\\sample\\crt\\", "makepath", "c" ); printf( "Path created with _makepath: %s\n\n", path_buffer ); _splitpath( path_buffer, drive, dir, fname, ext ); printf( "Path extracted with _splitpath:\n" ); printf( " Drive: %s\n", drive ); printf( " Dir: %s\n", dir ); printf( " Filename: %s\n", fname ); printf( " Ext: %s\n", ext ); }
这里提到了另外一个函数makepath,以下是程序的执行结果,看完之后,我想的_makepath和_splitpath用法大家心中自当了然了
Path extracted with _splitpath:
Drive: c:
Dir: \sample\crt\
Filename: makepath
Ext: .c
③在MFC中,因为有了类CString的存在,使得很多事情表面上变得简单了,记住,是“表面上”。
CString GetSuffix(CString strFileName) { return strFileName.Right(strFileName.GetLength()-strFileName.ReverseFind('.')-1); }
至于为什么要说表面上,大家翻阅下CString类的源代码就了然了。
④或许大家觉得还是不够直截了当,要是能像360那样一键搞定就欧了该多好,那么这个函数也许能满足你——PathFindExtension()。
#include <tchar.h> #include <iostream> #include <Windows.h> #include <shlwapi.h> using namespace std; #pragma comment(lib, "shlwapi.lib") int _tmain(int argc, _TCHAR* argv[]) { TCHAR szEXEPath[2048]; LPTSTR pszExtension; GetModuleFileName(NULL,szEXEPath,2048); pszExtension = PathFindExtension(szEXEPath); return 0; }
⑤当然还有更高端的选手,就像这样:
char *FileName; char *p=FileName; while(*p) p++; while(*p!='.') p--; p++;
相当高端有木有!!!
目前我用过的方法就是以上这些了,当然还有别的方法,大同小异了,非要追根溯源,那就要用汇编来说一说了,还是算了吧,大家都不容易,何苦如此为难自己。
上面的五种方法,不能说谁好谁坏,就像打DOTA吧,有的人求稳,有的人爱秀操作,有的人特JB猥琐,有的人就是TM喜欢卖骚……开心就好嘛,只要能最终得到后缀名,哪一种都OK,只是要在合适的地方选择合适的方法。
本人比较倾向于第二种_splitpath,因为我觉得我们经常忽视了stdlib.h里面的函数。