1. 程式人生 > >Linux下的文件夾創建命令使用實踐

Linux下的文件夾創建命令使用實踐

c程序 聲明 可見 strrchr 創建 二次 所在 begin false

【文章摘要

本文以實際的C源程序為樣例,介紹了Linux下的文件夾創建命令(mkdir)的用法。為相關開發工作的開展提供了故意的參考。

【關鍵詞

C語言 Linux 文件夾創建 makefile 開發

一、mkdir命令簡單介紹

mkdir命令用來創建指定名稱的文件夾,其命令格式為:mkdir [選項] 文件夾...

當中,[選項]能夠是“-m”、“-p”或“-v”。

此外,文件夾名是區分大寫和小寫的。

二、本程序流程

本文中的程序用於實現創建文件夾的功能。在創建文件夾之前。先檢查要創建的文件夾是否存在,若存在,則直接退出。

程序流程如圖1所看到的。

技術分享

圖1 程序流程圖

三、C程序源碼

本文中的源程序命名為“DirOper.c”。放置到“DirOper”project之下。並用makefile對源程序進行編譯。

1. “DirOper.c”文件代碼內容

/**********************************************************************

* 版權全部 (C)2014, Zhou Zhaoxiong

*

* 文件名: DirOper.c

* 文件標識:無

* 內容摘要:用於進行文件夾的相關操作

* 其他說明:無

* 當前版本號:V1.0

*

者:周兆熊

* 完畢日期:20140711

*

* 改動記錄1// 改動歷史記錄, 包含改動日期、版本號號、改動人及改動內容

* 改動日期:完畢日期:20140714

* 號: V1.0

* 人: Zhou Zhaoxiong

* 改動內容:創建

**********************************************************************/

#include <stdio.h>

#include <string.h>

#include <dirent.h>

#include <ftw.h>

// 數據類型

typedef unsigned char UINT8;

typedef signed int INT32;

typedef UINT8 BOOL;

// 宏定義

#define _S_IFDIR S_IFDIR

#define TRUE (BOOL)1

#define FALSE (BOOL)0

// 函數聲明

BOOL MyDirExists(UINT8 *pszDirectory);

void MyDirCreate(UINT8*pszDirectory);

BOOL MyForceDirCreate(UINT8 *pszDirectory);

INT32 main(void);

/**********************************************************************

* 功能描寫敘述:推斷文件夾是否存在

* 輸入參數: Directory-文件夾名稱

* 輸出參數:

* 值: 1 - 存在

0 - 不存在

* 其他說明:

* 改動日期 版本號號 改動人 改動內容

* -----------------------------------------------------------------------------

* 20140714 V1.0 ZhouZhaoxiong 創建

* ------------------------------------------------------------------------------*/

BOOL MyDirExists(UINT8 *pszDirectory)

{

struct stat st;

BOOL bResult = FALSE;

UINT8 cSep = ‘/‘;

UINT8 szDirectory[256] = {0};

UINT8 *pBegin = NULL;

// 對輸入指針進行異常推斷

if (NULL == pszDirectory)

{

printf("MyDirExists: input parameter is NULL!\n");

return TRUE;

}

strncpy((char*)szDirectory, (char *)pszDirectory, sizeof(szDirectory) - 1);

if(szDirectory[strlen(szDirectory)-1] == cSep) // 雙文件夾符號

{

pBegin =strrchr(szDirectory, (int)cSep);

if (NULL != pBegin)

{

pBegin[0] = 0;

}

}

if (stat(szDirectory, &st) == 0) // 檢查文件夾是否存在

{

bResult =((st.st_mode & _S_IFDIR) == _S_IFDIR);

}

else

{

bResult = 0;

}

return bResult;

}

/**********************************************************************

* 功能描寫敘述:創建文件夾

* 輸入參數: pszDirectory-文件夾名稱

* 輸出參數:

* 值: 1-創建成功 0-創建失敗

* 其他說明:

* 改動日期 版本號號 改動人 改動內容

*------------------------------------------------------------------

* 20140714 V1.0 Zhou Zhaoxiong 創建

*------------------------------------------------------------------- */

void MyDirCreate(UINT8 *pszDirectory)

{

UINT8 szRunCmd[256] ={0};

// 推斷輸入參數是否為空

if (pszDirectory == NULL)

{

printf("MyDirCreate: input parameter isNULL!\n");

return;

}

sprintf(szRunCmd, "mkdir -p %s", pszDirectory);

system(szRunCmd);

return;

}

/**********************************************************************

* 功能描寫敘述:強制創建文件夾

* 輸入參數: Directory-文件夾名稱

* 輸出參數:

* 值:

* 其他說明:

* 改動日期 版本號號 改動人 改動內容

*-----------------------------------------------------------------------

* 20140714 V1.0 ZhouZhaoxiong 創建

*------------------------------------------------------------------------------*/

BOOL MyForceDirCreate(UINT8 *pszDirectory)

{

UINT8 *pszStart = NULL;

UINT8 *pszEnd = NULL;

UINT8 szDirectory[256] = {0};

UINT8 cSep = ‘/‘;

UINT8 szTmp[2]={0};

if (NULL == pszDirectory)

{

printf("MyForceDirCreate: input parameter is NULL!\n");

return FALSE;

}

if(pszDirectory[strlen(pszDirectory)-1] != cSep) // 沒有文件夾結束

{

szTmp[0] = cSep;

szTmp[1] = 0;

strcat((char*)pszDirectory, szTmp);

//printf("MyForceDirCreate: Add sep.\n");

}

pszStart =(char*)pszDirectory + 1;

pszEnd = pszStart;

while (pszEnd)

{

if (!(pszEnd =strchr(pszStart,(int)‘/‘)))

{

break;

}

memset(szDirectory,0x00, sizeof(szDirectory));

strncpy(szDirectory,pszDirectory, pszEnd-pszDirectory);

pszStart = pszEnd +1;

/*

if (szDirectory[0] ==‘ \0‘)

{

break;

}

*/

if(!MyDirExists((UINT8*)szDirectory))

{

MyDirCreate(szDirectory);

}

}

return TRUE;

}

/****************************************************************

* 功能描寫敘述: 主函數

* 輸入參數:

* 輸出參數:

* 值: 0-運行成功 -1-運行失敗

* 其他說明:

* 改動日期 版本號號 改動人 改動內容

* --------------------------------------------------------------

* 20140714 V1.0 Zhou Zhaoxiong 創建

****************************************************************/

INT32 main(void)

{

UINT8 szDirectory[256] = {0};

memcpy(szDirectory,"/zhouzx/TestDir", strlen("/zhouzx/TestDir"));

// 先檢測文件夾是否存在, 假設不存在, 則創建文件夾

if(!MyDirExists(szDirectory))

{

printf("Now,create directory %s\n", szDirectory);

if(MyForceDirCreate(szDirectory))

{

printf("Create directory %ssuccessfully!\n", szDirectory);

}

else

{

printf("Create directory %sfailed!\n", szDirectory);

return -1;

}

}

else

{

printf("%salready exists!\n", szDirectory);

}

return 0;

}

2. makefile文件的內容

TestMakeFile :DirOper.c

gcc -c -g DirOper.c

gcc -g -o release/TestDir DirOper.o

rm *.o

四、程序運行結果

將本project文件傳到Linux機器上。

1. makefile文件運行過程

在makefile文件所在文件夾下(“DirOper”project之下)輸入“make”命令,運行結果例如以下:

[email protected]:~/zhouzx/DirOper> make

gcc -c -g DirOper.c

gcc -g -o release/TestDir DirOper.o

rm *.o

2. 程序運行結果

轉到release文件夾下,輸入“TestDir”命令,運行結果例如以下:

[email protected]:~/zhouzx/DirOper/release> TestDir

Now, create directory /zhouzx/TestDir

Create directory /zhouzx/TestDir/ successfully!

再次輸入“TestDir”命令,運行結果例如以下:

[email protected]:~/zhouzx/DirOper/release> TestDir

/zhouzx/TestDir already exists!

可見,第一次運行的時候成功創建了文件夾,而第二次運行的時候,因為文件夾已經存在了,因此程序打印了消息之後便退出了。

五、總結

本文用一個實際的C程序為例來說明了文件夾創建命令(mkdir)的用法。總的說來,該命令在Linux相關操作中使用得很的廣泛。大家一定要學會其用法。

(本人微博:http://weibo.com/zhouzxi?

topnav=1&wvr=5,微信號:245924426。歡迎關註!)

Linux下的文件夾創建命令使用實踐