【文章摘要】
本文以实际的C源程序为样例,介绍了Linux下的文件夹创建命令(mkdir)的用法。为相关开发工作的开展提供了故意的參考。
【关键词】
C语言 Linux 文件夹创建 makefile 开发
一、mkdir命令简单介绍
mkdir命令用来创建指定名称的文件夹,其命令格式为:mkdir [选项] 文件夹...
当中,[选项]能够是“-m”、“-p”或“-v”。
此外,文件夹名是区分大写和小写的。
二、本程序流程
本文中的程序用于实现创建文件夹的功能。在创建文件夹之前。先检查要创建的文件夹是否存在,若存在,则直接退出。
程序流程如图1所看到的。
图1 程序流程图
三、C程序源码
本文中的源程序命名为“DirOper.c”。放置到“DirOper”project之下。并用makefile对源程序进行编译。
1. “DirOper.c”文件代码内容
* 版本号: 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”命令,运行结果例如以下:
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。欢迎关注!)