创建路径并打开文件
C++中,当需要打开文件时,首先需要判断路径是否存在;若不存在,则需要创建路径。当存在多级路径时,需要依次创建。
使用非MFC函数。
#include <io.h> //_access fun
#include <direct.h> //_mkdir fun
BOOL isFolderExist(char * folder)
{
int ret = 0;
ret = _access(folder, 0);
if (ret == 0)
ret = TRUE;
else
ret = FALSE;
return ret;
}
int32_t createDirectory(char* directoryPath)
{
uint32_t dirPathLen = 0;
if (directoryPath != NULL) {
dirPathLen = strlen(directoryPath);
}
if (dirPathLen > FILENAME_MAX)
{
return -1;
}
char tmpDirPath[FILENAME_MAX] = { 0 };
for (uint32_t i = 0; i < dirPathLen; ++i)
{
tmpDirPath[i] = directoryPath[i];
if (tmpDirPath[i] == '\\' || tmpDirPath[i] == '/')
{
if (!isFolderExist(tmpDirPath))
{
int ret = _mkdir(tmpDirPath);
//BOOL ret = CreateDirectory(tmpDirPath, NULL);
if (ret != 0)
return -1;
}
}
}
return 0;
}
其中,主要用到了两个函数,分别是_access()和_mkdir(),这是不依赖MFC的函数。
_access()函数
头文件:<io.h>
函数原型:int _access(const char *pathname, int mode);
参数:pathname 为文件路径或目录路径, mode 为访问权限(在不同系统中可能用不能的宏定义重新定义)。
返回值:如果文件具有指定的访问权限,则函数返回0;如果文件不存在或者不能访问指定的权限,则返回-1。
备注:当pathname为文件时,_access函数判断文件是否存在,并判断文件是否可以用mode值指定的模式进行访问。
当pathname为目录时,_access只判断指定目录是否存在,在Windows NT和Windows 2000中,所有的目录都只有读写权限。
mode的值和含义如下所示:
00——只检查文件是否存在
02——写权限
04——读权限
06——读写权限
_mkdir()函数
头文件:<direct.h>
函数原型:int _mkdir( const char *dirname );
参数:dirname是指向目录的路径名指针。
返回值:返回0表示创建目录成功,返回-1表示失败。
备注:只能创建一级目录,即dirname倒数第二级必须是已经存在,否则创建不成功。
因此当有多级目录时,在创建之前,需要检验路径或者文件是否存在,用_access(dirname,0)来检验,返回0表示存在,-1不存在。
测试调用函数为如下所示:
#include <windows.h>
#define FILENAME_MAX 260
int main()
{
FILE *gbf = NULL;
unsigned char DataDir[FILENAME_MAX] = "D:\\Users\\admin\\Desktop\\MySample";
unsigned int SN = 123;
char filepath[FILENAME_MAX] = { 0 };
SYSTEMTIME sys;
GetLocalTime(&sys);
sprintf(filepath, "%s\\%d\\Log_%04d%02d%02d_%02d%02d%02d.txt", DataDir, SN, sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond);
if (!isFolderExist((char*)filepath))
{
createDirectory((char*)filepath);
}
gbf = fopen(filepath, "a");
//写文件的各种操作
if (gbf != NULL)
{
fclose(gbf);
gbf = NULL;
}
system("pause");
return 0;
}
另外,C++创建文件夹的四种方法,请参考自:https://blog.youkuaiyun.com/sinat_41104353/article/details/83149441