文件的操作, 有各种api, tc_file正是对这些操作进行封装, 形成更强大更易用的接口。
如果你想获取文件大小, 别自己写, 直接用:
ifstream::pos_type TC_File::getFileSize(const string &sFullFileName)
{
ifstream ifs(sFullFileName.c_str());
ifs.seekg(0, ios_base::end);
return ifs.tellg();
}
里面的file api, 多的是。
上次写代码, 需要在全路径中抽出文件名, 我居然还去自己写一个函数, 浪费精力。 看看这些都是什么:
string TC_File::getExePath()
{
string proc = "/proc/self/exe";
char buf[2048] = "\0";
int bufsize = sizeof(buf)/sizeof(char);
int count = readlink(proc.c_str(), buf,bufsize);
if ( count < 0 )
{
throw TC_File_Exception("[TC_File::getExePath] could not get exe path error", errno);
}
count = (count>=bufsize)?(bufsize-1):count;
buf[count] = '\0';
return buf;
}
string TC_File::extractFileName(const string &sFullFileName)
{
if(sFullFileName.length() <= 0)
{
return "";
}
string::size_type pos = sFullFileName.rfind('/');
if(pos == string::npos)
{
return sFullFileName;
}
return sFullFileName.substr(pos + 1);
}
string TC_File::extractFilePath(const string &sFullFileName)
{
if(sFullFileName.length() <= 0)
{
return "./";
}
string::size_type pos = 0;
for(pos = sFullFileName.length(); pos != 0 ; --pos)
{
if(sFullFileName[pos-1] == '/')
{
return sFullFileName.substr(0, pos);
}
}
return "./";
}
string TC_File::extractFileExt(const string &sFullFileName)
{
string::size_type pos;
if ((pos = sFullFileName.rfind('.')) == string::npos)
{
return string("");
}
return sFullFileName.substr(pos+1);
}
string TC_File::excludeFileExt(const string &sFullFileName)
{
string::size_type pos;
if ((pos = sFullFileName.rfind('.')) == string::npos)
{
return sFullFileName;
}
return sFullFileName.substr(0, pos);
}
string TC_File::replaceFileExt(const string &sFullFileName, const string &sExt)
{
return excludeFileExt(sFullFileName) + "." + sExt;
}
像TC_File这种类, 是不包含成员变量的类, 我们称之为“行为类”。
不多说。