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. 前端HTML以及HTML5(基本标签)

    前面一章介绍了一下前端的发展,这章简单介绍一下html的发展以及基本的标签. 一.HTML的发展史 1.概念 超文本标记语言(HyperText Markup Language,简称HTML)是为 [ ...

  2. elasticsearch 2.4 windows版jvm内存设置

    本文编写目的是因为网上有很多es修改内存配置的文章,方法也各有不同,但在我的情况下(es 2.4 windows版)发现很多方法都是无效的,有效只有以下方法 第一个是xms,第二个是xmx

  3. Ubuntu 11.04源

    ##国内源#这个北京交通大学的源也挺不错的,我们首选这个,速度很不错deb http://mirror.bjtu.edu.cn/ubuntu/ narwhal multiversedeb http:/ ...

  4. UI高端课程

    目后佐道IT教育正在打架报名中,欢迎高中生.大学生前来学习编程技术和UI设计,招生面向全国. 石破天惊 前100个报名者免费提供高级公寓居住(里面有空调,暖气,热水器,洗衣机). 赠送神秘课程价值29 ...

  5. UVA 11732 strcmp() Anyone (Trie+链表)

    先两两比较,比较次数是两者相同的最长前缀长度*2+1,比较特殊的情况是两者完全相同时候比较次数是单词长度*2+2, 两个单词'末尾\0'和'\0'比较一次,s尾部'\0'和循环内'\0'比较一次. 因 ...

  6. webpack-dev-server配置指南webpack3.0

    最近正在研究webpack,听说webpack可以自己搭建一个小型的服务器(使用过vue-cli的朋友应该都见识到过),所以迫不及待的想要尝试一下.不过,在实际操作中发现,用webpack搭建服务器仍 ...

  7. LeetCode分类-前400题

    1. Array 基础 27 Remove Element 26 Remove Duplicates from Sorted Array 80 Remove Duplicates from Sorte ...

  8. 怎么在WEBSTORM中设置代码模板 Live Templates

    怎么在WEBSTORM中设置代码模板 Live Templates setting 里面 https://www.cnblogs.com/xinzaimengzai/p/9938464.html

  9. python面试笔试题汇总

    Python面试攻略(嗨谈篇) 110道python面试笔试题汇总,你能答对几道? Python 面试问答 Top 25 2018 年最常见的 Python 面试题 & 答案

  10. PayPal为什么从Java迁移到Node.js 性能提高一倍 文件代码减少44%

    大家都知道PayPal是另一家迁移到Node.js平台的大型公司,Jeff Harrell的这篇博文 Node.js at PayPal  解释了为什么从Java迁移出来的原因: 开发效率提高一倍(2 ...