linux下C语言mkdir,Linux C实现mkdir功能
一:背景
Linux 中的mkdir命令是用來(lái)創(chuàng)建一個(gè)目錄的,相應(yīng)的就需要使用到linux中的系統(tǒng)調(diào)用函數(shù)mkdir來(lái)實(shí)現(xiàn)目錄創(chuàng)建的功能。單單只是創(chuàng)建目錄的話一個(gè)系統(tǒng)調(diào)用足以,本文是使用mkdir函數(shù)來(lái)實(shí)現(xiàn)mkdir -p這個(gè)選項(xiàng)的功能,對(duì)其不存在的父目錄實(shí)現(xiàn)創(chuàng)建。
二:思路
對(duì)于一個(gè)a/b/c這樣的一個(gè)多級(jí)目錄,要想實(shí)現(xiàn)父目錄的創(chuàng)建方法和思路有很多,可以進(jìn)行字符串處理分出一級(jí)一級(jí)目錄來(lái),但是這樣實(shí)現(xiàn)很是繁瑣,以至于我想到了遞歸實(shí)現(xiàn)。
思路如下:
1.先判斷a/b/c是否存在,不存在獲取其父目錄判斷。若存在直接退出
2.判斷a/b是否存在,不存在就獲取其父目錄,若存在退出
3.判斷a/是否存在,不存在就獲取其父目錄,若存在退出
4.如果其父目錄為.或/時(shí)退出
思路大體如下。為了實(shí)現(xiàn)以上過(guò)程,需要一個(gè)可以獲得一個(gè)目錄的父目錄的函數(shù)。果斷man。
最終定位到dirname函數(shù)非常符合我的要求。函數(shù)聲明如下:
#include
char *dirname(char *path);
------------------------------分割線------------------------------
將C語(yǔ)言梳理一下,分布在以下10個(gè)章節(jié)中:
三:實(shí)現(xiàn)
#include
#include
#include
#include
#include
#include
#include
#define MAXSIZE 100
void Createdir(char *);
int main(int argc,char *argv[])
{
#判斷參數(shù)
if(argc <= 1){
printf("mkdir:Usage:dirstr\n");
exit(1);
}
#遍歷參數(shù),對(duì)每個(gè)參數(shù)進(jìn)行操作
while(--argc){
argv++;
Createdir(*argv);
}
}
void Createdir(char *path)
{
char data[MAXSIZE];
#判斷是否是當(dāng)前目錄或/目錄
if((strcmp(path,".") == 0) || (strcmp(path,"/")==0))
return;
#判斷目錄是否存在
if(access(path,F_OK) == 0)
return;
else{
#保存目錄
strcpy(data,path);
#獲取目錄的父目錄
dirname(path);
#遞歸執(zhí)行
Createdir(path);
}
#創(chuàng)建目錄
if(mkdir(data,777) == -1){
perror("mkdir error");
exit(1);
}
return;
}
四:總結(jié)
在寫(xiě)mkdir -p這個(gè)功能的時(shí)候,思路很明確,代碼也基本上早就寫(xiě)好了,但是調(diào)試花了很長(zhǎng)時(shí)間。究其原因是在于dirname這個(gè)函數(shù),看其聲明很明顯就是給一個(gè)目錄的path字符串指針,返回一個(gè)指向其目錄的字符串指針,但是其實(shí)不然。dirname不僅返回一個(gè)指向其父目錄的字符串指針還可能修改傳入的參數(shù)path的值為父目錄字符串。man文檔中說(shuō)明如下:
The? dirname()? function? may? modify? the string pointed to by path, and may return a
pointer to static storage that may then be overwritten by subsequent calls to dirname().
最終還是通過(guò)printf打印調(diào)試的,沒(méi)有借助gdb,主要還是這家伙用起來(lái)不舒服。
總結(jié)
以上是生活随笔為你收集整理的linux下C语言mkdir,Linux C实现mkdir功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Unity NavMesh导航报错“Se
- 下一篇: 每天一个linux命令(4):mkdir