编写工具类
最近在写一个C++的项目,发现编写项目的过程真是曲折,所以写通过博客方式来对本项目进行一个重新的梳理。以便于自己来更好的了解这个项目。
1. 时间类的编写
我们都知道在C++中获取时间戳很简单,但是怎么把一个时间戳转换为我们平时所看的时间还是不太了解。通过了解发现了一个函数可以把对应格式的时间信息写到字符串当中。但是我们还是要把一个时间的信息放到结构体当中。话不多说,直接上代码
class Time
{
    public:
        static std::string getTime()
        {
            // 获取时间戳
            time_t t = time(nullptr);
            struct tm st;
            // 将时间戳解析出来各种信息放到定义出来的结构体当中
            localtime_r(&t, &st);
            char tmp[128];
            // 把我们需要的时间格式放到一个字符数组当中
            strftime(tmp, 127, "%H:%M:%S", &st);
            return tmp;
        }
};
 
运行结果如下:
 
2. 文件类的编写
我们这个项目可能用到的功能:
- 判断这个文件是否存在
 - 获取此文件的父目录
 - 创建一个文件
 
接下来进行分别实现:
2.1 判断这个文件是否存在
如何判断一个文件是否存在,我们可以调用Linux的一个库函数。
class File
{
    public:
        static bool isExists(const std::string& pathname)
        {
            struct stat st;
            return stat(pathname.c_str(), &st);
        }
};
修改后的:
class File
{
    public:
        static bool isExists(const std::string& pathname)
        {
            struct stat st;
            return stat(pathname.c_str(), &st);
        }
};
 
2.2 获取此文件的父目录
获取父目录只需要找到最后一个“/”的位置,分割出来就可以了
class File
{
    public:
        static std::string getPath(const std::string pathname)
        {
            // "abc/a/b/a.txt"
            // "b.txt"
            size_t pos = pathname.find_last_of("/\\");
            if (pos == std::string::npos)
            {
                return "./";
            }
            return pathname.substr(0, pos + 1);
        }
        
};
 
测试结果如下:
 
2.3 创建一个文件
我们知道这个文件传进来的时候可能还包含父目录,所以我们需要判断每一层的父目录是否存在。
在编写创建文件的工具方法时,遇到一个程序一直死循环的问题,这个时候就不得不调试运行一个看看问题出在哪里。
 通过调试发现原来是判断文件是否存在这个方法写错了,少写了一个判断。。。。
 新修改的放在原来文件的下面了。我们重新运行一下看看。还是不对,继续调试。
 原来是传递的时候直接把整个文件名字传进来了,我们只需要父目录就可以了
 真操蛋啊。
 原来这个方法只是为了创建父目录啊,我们是不需要创建具体的文件的
 代码如下:
class File
{
    public:
        static void createFile(const std::string& pathname)
        {
            // "abc/a/b/a.txt"
            // "b.txt"
            size_t idx = 0;
            while (idx < pathname.size())
            {
                size_t pos = pathname.find_first_of("/\\", idx);
                // 只有在最后一层的目录时,我们才可以直接创建整体,否则可能更改现有
                // 的目录
                if (pos == std::string::npos)
                {
                    mkdir(pathname.c_str(), 0777);
                }
                std::string parent_id = pathname.substr(0, pos + 1);
                if (isExists(parent_id))
                {
                    idx = pos + 1;
                    continue;
                }
                mkdir(parent_id.c_str(), 0777);
                idx = pos + 1;
            }
        }
};
 
到这里工具类就编写完成了。

















