1. 使用system函数调用系统命令"md"

注意:字符串变量的话赋值时要使用双斜杠"\\":

system("md C:\\newfolder\\");

如果需要动态新建目录的话:

char *path = "C:\\newfolder\\";

char swap[255];

sprintf(swap, "md %s", path);

system(swap);

不用判断返回值,系统会自动将错误信息打印到标准输出上.

  1. _mkdir()

#include <direct.h>

_mkdir("C:\\newfolder");//新建

_rmdir("C:\\newfolder");//删除

#include<io.h>

_access("C:\\newfolder");//判断文件夹是否存在

缺点是不能一下新建多层文件夹,可以裁剪字符串一级一级创建

如何新建多层目录:

//这里的const是对函数的使用者而言的,其实函数内部修改了该const字符串,但又还原了

void initPath(const char *path)
{
assert(path!= NULL);

// 一层层判断目录是否已存在,不存在就新建
// 这里的字符串最后一个字符正常情况下是'\'
// 所以最后可以不用再判断了
// 之所以说上面一点是因为对_mkdir来说
// "D:\document"和"D:\document\"没有区别
char *tmp = (char *)path;

while (*tmp)
{
if (*tmp == '\\')
{
*tmp = '\0';
if (_access(path, 0))// 头文件io.h
{
if (_mkdir(path))
{
#ifdef _DEBUG
fprintf(stderr, "Failed to create directory %s:%s\n",
path, strerror(errno));
#endif
}
}
*tmp = '\\';
}
++tmp;
}
}

  1. CreateDirectory()

该API也不能新建多层文件夹,而且要打印该函数的出错信息也很复杂.Windows这一套真真的让人恶心.思路是一样的,先一层一层判断文件夹是否存在,如果不存在就新建.判断文件夹是否存在使用GetFileAttributes()函数,如果函数返回-1,说明文件/文件夹不存在;否则如果返回的属性有FILE_ATTRIBUTE_DIRECTORY,说明文件夹已存在.

void createDirectory(const char *path)
{
assert(path!= NULL);
char *tmp = (char *)path;
LPVOID lpMsgBuf;

while(*tmp)
{
if (*tmp == '\\')
{
*tmp = '\0';
DWORD fileAttr = GetFileAttributes((LPCSTR) path);
if (fileAttr == 0xFFFFFFFF || !(fileAttr & FILE_ATTRIBUTE_DIRECTORY))
{
if (!CreateDirectory((LPCTSTR) path, NULL))
{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION);
}
}
*tmp = '\\';
}
++tmp;
}
// Free the buffer.
LocalFree(lpMsgBuf);
}

关于FormatMessage函数,要多说一点关于Windows API错误(失败)信息的获取.看到网上说《Multitheading Applications inWin32(侯捷译)》书里讲述通过宏MTVERIFY就可以知道调用的Windows API函数错在什么地方:

/*
* MtVerify.h
*
* Error handling for applications in
* "Multitheading Applications in Win32"
*
* The function PrintError() is marked as __inline so that it can be
* included from one or more C or C++ files without multiple definition
* errors. For the examples in this book, this works fine.
* To use the PrintError() in an application, it should be taken out,
* placed in its own source file, and the "__inline" declaration removed
* so the function will be globally available.
*/

#pragma comment(lib, "USER32")

#include <crtdbg.h>
#define MTASSERT(a) _ASSERTE(a)

#define MTVERIFY(a) if (!(a)) PrintError(#a, __FILE__, __LINE__, GetLastError())

__inline void PrintError(LPSTR linedesc, LPSTR filename, int lineno, DWORD errnum)
{
LPSTR lpBuffer;
char errbuf[256];

#ifdef _WINDOWS
char modulename[ MAX_PATH];
#else // _WINDOWS
DWORD numread;
#endif // _WINDOWS

FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
errnum,
LANG_NEUTRAL,
(LPTSTR) &lpBuffer,
0,
NULL);

wsprintf(errbuf, "\nThe following call failed at line %d in %s:\n\n"
"%s\n\nReason: %s\n", lineno, filename, linedesc, lpBuffer);

#ifdef _WINDOWS
GetModuleFileName(NULL, modulename, MAX_PATH);
MessageBox(NULL, errbuf, modulename, MB_ICONWARNING | MB_OK | MB_TASKMODAL | MB_SETFOREGROUND);
#else
WriteFile(GetStdHandle(STD_ERROR_HANDLE), errbuf, strlen(errbuf), &numread, FALSE);
Sleep(3000);
#endif

exit(EXIT_FAILURE);
}

经过本人亲测,可用.那么上面的函数可以改为:

#include "MtVerify.h"
void createDirectory(const char *path)
{
assert(path != NULL);
char *tmp = (char *)path;

while(*tmp)
{
if (*tmp == '\\')
{
*tmp = '\0';
DWORD fileAttr = GetFileAttributes((LPCSTR) path);
if (fileAttr == (DWORD) -1 || !(fileAttr & FILE_ATTRIBUTE_DIRECTORY))
{
MTVERIFY(CreateDirectory((LPCTSTR) path, NULL));
}
*tmp = '\\';
}
++tmp;
}

<span style="white-space:pre"> </span>}

  1. MakeSureDirectoryPathExists()

这绝对是一个暴力的函数,啥都不说了,直接用:

MTVERIFY(MakeSureDirectoryPathExists(path));

别忘了加上两句:

#include <ImageHlp.h>

#pragma comment(lib, "ImageHlp.lib")

加上一点:该函数强制要求参数字符串以反斜杠'\'结尾,如果不以'\'结尾,最后一层文件夹不会建立.

  1. 最后再说几个判断文件夹是否存在的方法
    1. PathFileExists() 可以判断文件或者文件夹是否存在:

if (PathFileExists(path)) {...}

  1. MFC的CFileFind类

使用CFileFind的成员函数FindFile(),FindNextFile()和IsDirectory().

void createDirectory(const char *path)
{
assert(path != NULL);
char *tmp = (char *)path;
CFileFind ff;

// 不能搜索硬盘分区根目录,所以要略过
// 如果严谨一些可以判断是否已到字符串结尾
while (*tmp++ != '\\') {}

while (*tmp)
{
if (*tmp == '\\')
{
*tmp = '\0';
if (ff.FindFile(path, 0))
{
// 必须要调用一次FindNextFile()后才能判断
// IsDirectory(),不知道为什么
// 因为同一目录下的文件夹和文件也不能完全重名
// 所以不用担心会找到多个同名的文件/文件夹
ff.FindNextFile();
if (!ff.IsDirectory())
{
MTVERIFY(CreateDirectory((LPCTSTR) path, NULL));
}
}
else
{
MTVERIFY(CreateDirectory((LPCTSTR) path, NULL));
}
*tmp = '\\';
}
++tmp;
}

<span style="white-space:pre"> </span>}

  1. 和上面相似,使用Win32 API FindFirstFile()和FindNextFile()

void createDirectory(const char *path)
{
assert(path != NULL);
char *tmp = (char *)path;

// 不能搜索硬盘分区根目录,所以要略过
// 如果严谨一些可以判断是否已到字符串结尾
while (*tmp++ != '\\') {}

WIN32_FIND_DATA wfd;

while (*tmp)
{
if (*tmp == '\\')
{
*tmp = '\0';
if (FindFirstFile(path, &wfd) == INVALID_HANDLE_VALUE ||
!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
MTVERIFY(CreateDirectory((LPCTSTR) path, NULL));
}
*tmp = '\\';
}
++tmp;
}
}

摘自http://blog.csdn.net/lgouc/article/details/8166522

Windows下新建多级文件夹的更多相关文章

  1. Windows下如何将一个文件夹通过Git上传到GitHub上(转)

    在通过windows系统的电脑上写代码,需要将项目上传到GitHub上去.比如在Pycharm上写Django后端,整个项目是一个文件夹的形式,那么怎么才能这个文件夹通过Git命令上传到GitHub上 ...

  2. Windows下C++遍历文件夹中的文件

    Windows下,在VS中开发,C++遍历文件夹下文件. 在Windows下,遍历文件所用到的函数和结构体,需要在程序中包含头文件#include <io.h>,在VS中,头文件io.h实 ...

  3. Windows下删除.svn文件夹的最简易方法

    建立一个文本文件,取名为kill-svn-folders.reg(扩展名由txt改为reg),内容如下: Windows Registry Editor Version 5.00 [HKEY_LOCA ...

  4. Windows 下自动同步文件夹内容到另一个文件夹下

    实现windows 使用bat脚本文件,复制文件夹到另一个盘,参考如下代码:/y是可以不显示:提示你需要覆盖一个文件,如下图: bat文件内容为 @echo off echo "使用bat脚 ...

  5. windows下批量生成文件夹

    在windows环境下如果想要批量生成文件夹: 1.创建一个记事本文件 2.首行大写MD 3.后面加上你想创建的文件夹的名字,每个名字之间有空格 4.退出记事本并保存 5.将记事本文件后缀改为bat文 ...

  6. 【Sonarqube】windows下更改Temp文件夹的位置

    下载的最新Sonarqube版本(4.5.1),通过StartSonar.bat文件可以启动,但是无法通过StartNTService.bat文件启动,原因为默认的Temp文件不可写入, java.l ...

  7. Windows下删除顽固文件夹

    参考链接: https://www.cnblogs.com/azbane/p/9808802.html 第一步:修改当前文件夹所有者为管理员 takeown /f * /a /r 第二步:修改管理员权 ...

  8. windows下 删除指定文件夹里面一周前的所有文件和文件夹的bat

    forfiles /p "指定文件夹路径" /m * /s /d -7 /c "cmd /c if @isdir==TRUE (rd /q @path) else del ...

  9. 新建childTest文件夹,里面依然放进我们需要的.py文件即可

    一.模块 我们编写文件:a.py,放在C:\Python34\Lib\sit-packages下,里面写上一句代码为: print('this is a') 之后我们就可以在我们的代码里面引用a.py ...

随机推荐

  1. 机器学习框架ML.NET学习笔记【6】TensorFlow图片分类

    一.概述 通过之前两篇文章的学习,我们应该已经了解了多元分类的工作原理,图片的分类其流程和之前完全一致,其中最核心的问题就是特征的提取,只要完成特征提取,分类算法就很好处理了,具体流程如下: 之前介绍 ...

  2. [原]Maven项目编译后classes文件中没有.xml问题

    在做spring+mybatiss时,自动扫描都配置正确了,却在运行时出现了如下错误.后来查看target/classes/.../dao/文件夹下,发现只有mapper的class文件,而没有xml ...

  3. Java基础(Scanner、Random、流程控制语句)

    第3天 Java基础语法 今日内容介绍 u 引用数据数据类型(Scanner.Random) u 流程控制语句(if.for.while.dowhile.break.continue) 第1章 引用数 ...

  4. 卡了很久的bug

    背景:在一个简单的项目中,通过循环前端传来的一个数组,使用mongodb条件查询数据,将满足条件的数据push进一个新数组,并返回至前端. 问题:每次调试到第五行,会自动跳过,直接执行12行,打印出来 ...

  5. 告别CMD.windows终端神器conemu设置

    前言 一种刘姥姥进大观园的感觉,现在是见啥啥新鲜.因为之前不怎么接触到命令操作,平时偶尔用用cmd也没觉得什么不妥.直到现在经常调试脚本,使用git越发感觉不方便.看见同事使用的terminal绚丽夺 ...

  6. Android 贝塞尔曲线的浅析

    博客也开了挺长时间了,一直都没有来写博客,主要原因是自己懒---此篇博客算是给2017年一个好的开始,同时也给2016年画上一个句点,不留遗憾. 那就让我们正式进入今天的主题:贝塞尔曲线. 首先,让我 ...

  7. 【TensorFlow入门完全指南】模型篇·最近邻模型

    最近邻模型,更为常见的是k-最近邻模型,是一种常见的机器学习模型,原理如下: KNN算法的前提是存在一个样本的数据集,每一个样本都有自己的标签,表明自己的类型.现在有一个新的未知的数据,需要判断它的类 ...

  8. 在DataGridView控件中显示下拉列表

    实现效果: 知识运用: DataGridViewComboBoxColumn类 //通过该类可以创建下拉列表样式的列 实现代码: private void Form1_Load(object send ...

  9. Python 继承、派生、组合、接口、抽象类

    继承是一种是的关系,和组合对比,组合是一种有的关系,这两者都是解决代用重用问题的 继承 注意:继承不是遗传,在显示角度中,是通过对象抽象成类,再把这些类抽象成一个,就是父类.是自下而上的过程,在程序中 ...

  10. CPP-网络/通信:经典HTTP协议详解

    2008-11-03 09:11 by Hundre, 266688 阅读, 23 评论, 收藏, 编辑 转自:http://blog.csdn.net/gueter/archive/2007/03/ ...