前几天,因为在linux上编程,所以需要使用一些linux下的API。终于体会到了什么叫做“自己动手,丰衣足食”的感觉!C开发果然名不虚传啊,很多以前在net下司空见惯的算法竟然都要自己写,就算是一个小小的建立目录路径功能都是要自己写。咳!
先来看一下linux下的IO编程中,建立目录功能。如果我们需要建立一个目录,如果路径名为"/app/locker_server/data/log/”(window下可以为”c:/app/locker_server/data/log/”),那么我们如果在net或者java的编程环境中,使用一个API方法就能搞定了,net frame或者jvm会更加目录“联级”的去创建;但是在c下,api函数mkdir只是建立当前目录下的子目录,对于“联级”目录,只能“望洋兴叹”了。所以,对于一般性的程序,一个“级联”创建文件夹是必不可少的,毕竟存储数据文件,log文件都是需要根据配置的文件夹路径创建的,那么这个算法怎么实现呢?其实很简单,还是要靠mkdir,还记得吗?mkdir的功能是创建当前目录的子目录,那么我们只要在创建子目录以后进入创建的子目录,然后再创建子目录就ok了。要注意的地方就是判断要创建的目录是否已经存在,然后怎么根linux下的’/’目录分隔符拆分目录。
mkdir by cascading
{
int result,length,pointer_postion = 0;
char *postion;
char *path_temp = path;
char cwd[MAX_PATH_SIZE];
char *subfolder;
bool is_error = false;
if(NULL == getcwd(cwd,sizeof(cwd)))
{
printf("Error!file:"__FILE__",line:%d.dir path name more than max_path_size %d.\n",
__LINE__,MAX_PATH_SIZE);
return false;
}
if(*path_temp == '/')
{
if(-1 == chdir("/"))
{
printf("Error!file:"__FILE__",line:%d.change dir to root dir is error.error info is %s.\n",
__LINE__,strerror(errno));
return false;
}
pointer_postion ++;
}
if(*(path_temp + strlen(path_temp)-1) == '/')
{
path_temp[strlen(path_temp)-1] ='\0';
}
while(pointer_postion -1 != strlen(path_temp))
{
do
{
postion = strchr(path_temp + pointer_postion,'/');
if(0 == postion)
{
length = strlen(path_temp) - pointer_postion;
}
else
{
length = postion - path_temp - pointer_postion;
}
subfolder = (char *)calloc(length,sizeof(char));
memcpy(subfolder,path_temp+pointer_postion,length);
if(is_dir(subfolder))
{
if(-1 == chdir(subfolder))
{
printf("Error!file:"__FILE__",line:%d.change dir to cwd is error.error info is %s.\n",
__LINE__,strerror(errno));
return false;
}
pointer_postion = pointer_postion + length + 1;
break;
}
if(-1 == mkdir(subfolder,mode))
{
printf("Error!file:"__FILE__",line:%d.cascad creating folder is error.error info is %s.\n",
__LINE__,strerror(errno));
is_error = true;
break;
}
if(-1 == chdir(subfolder))
{
printf("Error!file:"__FILE__",line:%d.change dir to cwd is error.error info is %s.\n",
__LINE__,strerror(errno));
return false;
}
pointer_postion = pointer_postion + length + 1;
break;
}
while(false);
if(NULL != subfolder)
{
free(subfolder);
subfolder = NULL;
}
if(is_error)
{
break;
}
}
if(-1 == chdir(cwd))
{
printf("Error!file:"__FILE__",line:%d.change dir to cwd is error.error info is %s.\n",
__LINE__,strerror(errno));
return false;
}
return true;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述