【文章摘要】
本文以實際的C源程式為例子,介紹了Linux下的目錄建立指令(mkdir)的使用方法,為相關開發工作的開展提供了有益的參考。
【關鍵詞】
C語言 Linux 目錄建立 makefile 開發
mkdir指令用來建立指定名稱的目錄,其指令格式為:mkdir [選項] 目錄...
其中,[選項]可以是“-m”、“-p”或“-v”。此外,目錄名是區分大小寫的。
本文中的程式用于實作建立目錄的功能。在建立目錄之前,先檢查要建立的目錄是否存在,若存在,則直接退出。
程式流程如圖1所示。
圖1 程式流程圖
本文中的源程式命名為“DirOper.c”,放置到“DirOper”工程之下,并用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};
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')
*/
if(!MyDirExists((UINT8*)szDirectory))
MyDirCreate(szDirectory);
return TRUE;
/****************************************************************
* 功能描述: 主函數
* 輸入參數: 無
* 輸出參數: 無
* 傳回值: 0-執行成功 -1-執行失敗
* 其他說明: 無
* 修改日期 版本号 修改人 修改内容
* --------------------------------------------------------------
* 20140714 V1.0 Zhou Zhaoxiong 建立
****************************************************************/
INT32 main(void)
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;
}
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
将本工程檔案傳到Linux機器上。
1. makefile檔案運作過程
在makefile檔案所在目錄下(“DirOper”工程之下)輸入“make”指令,執行結果如下:
zhou@linux:~/zhouzx/DirOper> make
gcc -c -g DirOper.c
gcc -g -o release/TestDir DirOper.o
rm *.o
2. 程式執行結果
轉到release目錄下,輸入“TestDir”指令,執行結果如下:
zhou@linux:~/zhouzx/DirOper/release> TestDir
Now, create directory /zhouzx/TestDir
Create directory /zhouzx/TestDir/ successfully!
再次輸入“TestDir”指令,執行結果如下:
/zhouzx/TestDir already exists!
可見,第一次運作的時候成功建立了目錄,而第二次運作的時候,由于目錄已經存在了,是以程式列印了消息之後便退出了。
本文用一個實際的C程式為例來說明了目錄建立指令(mkdir)的使用方法。總的說來,該指令在Linux相關操作中使用得非常的廣泛,大家一定要學會其用法。
(本人微網誌:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,歡迎關注!)