掘金 后端 ( ) • 2024-06-29 11:26

概述

文件和目录操作是操作系统层面上的基础功能,允许用户或程序对磁盘上的文件以及目录结构进行管理。文件操作主要包括:创建文件、打开文件、读写文件内容、移动或定位文件指针以及关闭文件等功能,目录操作主要包括:创建目录、删除目录、移动目录、重命名目录、列出目录内容等功能。在C/C++编程中,除了标准库提供的stdio.h中的文件和目录操作函数外,还可以利用POSIX API (dirent.h, unistd.h) 或Windows API来进行更底层的操作。

CHP_File类

在Windows和Linux操作系统下进行文件和目录操作的系统API并不相同,比如:对于创建目录的操作,Windows下使用CreateDirectory函数,Linux下使用mkdir函数。为了封装跨平台的文件目录操作,我们实现了CHP_File类。CHP_File类的头文件,可参考下面的示例代码。

#pragma once

#include <string>
#include <vector>

typedef void *HFileFinder;

class CHP_File
{
public:
    static int GetFileTime(const char *pszFile, time_t &tmCreated, time_t &tmModified);

    static int GetFileSize(const char *pszFile, unsigned int &uiSizeBytes);

    static int CreateDir(const char *pszDir, bool bRecursive = true);

    static int RemoveDir(const char *pszDir, bool bIgnoreError = true);

    static void FindFiles(const char *pszDir, const char *pszFilter, std::vector<std::string> &vctFile, bool bRecursive = true);

    static void FindSubDirs(const char *pszDir, std::vector<std::string> &vctSubDir, bool bRecursive = true);

    static char *FindOpen(HFileFinder &hFinder, const char *pszDir, bool bFindDir, char *pszFile, int nFileLen);

    static char *FindNext(HFileFinder hFinder, const char *pszDir, bool bFindDir, char *pszFile, int nFileLen);

    static void FindClose(HFileFinder hFinder);

private:
    CHP_File();
    ~CHP_File();

    static char *FindFile(HFileFinder &hFinder, const char *pszDir, bool bFindDir, char *pszFile, int nFileLen, bool bFirst);

#ifdef _WIN32
    static bool RemoveExistingDir(const char *pszDir);
    static bool RemoveExistingFile(const char *pszFile);
#endif
};

CHP_File类是一个接口类,不需要实例化。因此,我们将构造函数和析构函数声明成了私有的,并提供了9个静态函数。下面,我们将分别介绍这几个导出的公共接口。

GetFileTime:获取文件的创建时间和修改时间。参数pszFile为文件名,参数tmCreated为文件的创建时间,参数tmModified为文件的修改时间,返回值为0表示成功,其他为错误码。

GetFileSize:获取文件的大小。参数pszFile为文件名,参数uiSizeBytes为文件大小,单位为字节,返回值为0表示成功,其他为错误码。

CreateDir:创建目录。参数pszDir为待创建的目录名,参数bRecursive表示是否递归创建所有目录,返回值为0表示成功,其他为错误码。

RemoveDir:删除目录。参数pszDir为待删除的目录名,参数bIgnoreError表示是否忽略错误,返回值为0表示成功,其他为错误码。

FindFiles:查找指定目录下的文件。参数pszDir为待查找的目录;参数pszFilter为过滤器,支持'?'和'*',为NULL或空字符串时,表示查找所有文件;参数vctFile为符合条件的所有文件;参数bRecursive表示是否递归子目录查找。

FindSubDirs:查找指定目录下的目录。参数pszDir为待查找的目录,参数vctSubDir为符合条件的所有目录,参数bRecursive表示是否递归子目录查找。

FindOpen:打开文件查找,适用于逐个查找文件。参数hFinder为文件查找的句柄;参数pszDir为待查找的目录;参数bFindDir表示查找目录还是文件,true表示查找目录,false表示查找文件;参数pszFile为找到的文件名或者目录名;参数nFileLen为文件名或者目录名的长度。返回值为非NULL表示找到,是找到的文件名或目录名的buffer指针,否则表示未找到。

FindNext:查找下一个文件。参数hFinder为文件查找的句柄;参数pszDir为待查找的目录;参数bFindDir表示查找目录还是文件,true表示查找目录,false表示查找文件;参数pszFile为找到的文件名或者目录名;参数nFileLen为文件名或者目录名的长度。返回值为非NULL表示找到,是找到的文件名或目录名的buffer指针,否则表示未找到。

FindClose:关闭文件查找。参数hFinder为文件查找的句柄。

💡 需要该C++实用库源码的大佬们,可搜索微信公众号“希望睿智”。添加关注后,输入消息“超级好用的C++实用库”,即可获得源码的下载链接。

总结

在CHP_File类中,我们封装了获取文件的创建时间和修改时间、获取文件的大小、创建目录、删除目录、查找指定目录下的文件、查找指定目录下的目录、打开文件查找、查找下一个文件、关闭文件查找等跨平台的功能和函数。这些函数,是通过兼容多种操作系统API,或使用标准库提供的函数来实现的。