【文章摘要】
本文以实际的C源程序为例子,介绍了Linux下的目录创建命令(mkdir)的使用方法,为相关开发工作的开展提供了有益的参考。
【关键词】
C语言 Linux 目录创建 makefile 开发
一、mkdir命令简介
mkdir命令用来创建指定名称的目录,其命令格式为:mkdir [选项] 目录...
其中,[选项]可以是“-m”、“-p”或“-v”。此外,目录名是区分大小写的。
二、本程序流程
本文中的程序用于实现创建目录的功能。在创建目录之前,先检查要创建的目录是否存在,若存在,则直接退出。
程序流程如图1所示。
图1 程序流程图
三、C程序源代码
本文中的源程序命名为“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};
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
四、程序执行结果
将本工程文件传到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”命令,执行结果如下:
zhou@linux:~/zhouzx/DirOper/release> TestDir
/zhouzx/TestDir already exists!
可见,第一次运行的时候成功创建了目录,而第二次运行的时候,由于目录已经存在了,因此程序打印了消息之后便退出了。
五、总结
本文用一个实际的C程序为例来说明了目录创建命令(mkdir)的使用方法。总的说来,该命令在Linux相关操作中使用得非常的广泛,大家一定要学会其用法。
(本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,欢迎关注!)