以下の関数ChangeExtendは拡張子を変更する。
拡張子を変えたい事態と言うのは時折生じる。例えばfilename.txtという入力に対し、filname.backupというファイル名を出力したいとか、ファイル名がfilename.docでも、中身はプレーンテキストなので.txtのほうが都合がいいなどだ。
この関数はファイル名の拡張子部分のみを指定した文字列に置き換える。ただし拡張子がない場合は指定した拡張子を付け加える。
#include <cassert> #pragma warning( disable : 4996 ) //! @brief 入力したファイル名の拡張子を指定したものに変更する //! @param [in,out] fname 少なくともファイル名を含むファイルパス //! @param [in] ext 新しい拡張子。「.」を含んではならない //! @warning ディレクトリ区切りは'\'とする //! @return なし void ChangeExtend(TCHAR* fname,TCHAR *ext){ assert(fname != nullptr); assert(ext != nullptr); TCHAR* ldot=fname; //最後に出現したディレクトリ区切りを求める TCHAR* posdir = _tcsrchr(fname,_T('\\')); //最後に出現した.を求める ldot=_tcsrchr(fname,_T('.')); //C:\abc.def\\abc など、最後の.より\の方が後に来る場合、拡張子なしと判断する if( posdir > ldot){ ldot = nullptr; } if( ldot == nullptr){ _tcscat(fname,_T(".")); } else{ _tcscpy(ldot,_T(".\0")); } _tcscat(fname,ext); } //////////////////////////////////////////////////// // テスト int _tmain(int argc, _TCHAR* argv[]) { TCHAR fname[1024]; _tcscpy(fname,_T("C:\\hello\\dir\\filename.doc")); ChangeExtend(fname,_T("txt")); _tprintf(fname); puts(""); getchar(); return 0; }
入力 | 出力 |
C:\hello\folder\ile | C:\hello\folder\file.txt |
C:\hello\folder\file.doc | C:\hello\folder\file.txt |
C:\hello\folder\.doc | C:\hello\folder\.txt |
C:\hello\folder\ | C:\hello\folder\.txt |
C:\hello\fol.der\file.doc | C:\hello\fol.der\file.txt |
file.doc | file.txt |