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

转载于:https://www.cnblogs.com/wangfx91/p/4624489.html

Windows下新建多级文件夹相关推荐

  1. windows下批处理删除文件夹、删除文件、if exist用法

    windows下批处理删除文件夹.删除文件.if exist用法 开发中用到Window批处理del.rd.if exist,总结用法便于后续使用. windows下批处理删除文件: * 使用del指 ...

  2. 系统运维系列 之在Windows下可以查看文件夹大小的工具TreeSize Free

    给大家推荐一个在Windows下可以查看文件夹大小的工具TreeSize Free. 下载链接: https://customers.jam-software.de/downloadTrial.php ...

  3. 如何用python新建文件夹_用Python编写一个每天都在系统下新建一个文件夹的脚本...

    这个程序的功能非常的简单,就是每天在系统中新建一个文件夹.文件夹即当前的时间.此代码是在同事那边看到的,为了锻炼下自己薄弱的Python能力,所以花时间重新写了一个.具体代码如下: import ti ...

  4. 自定义windows下自动清除文件夹或者文件的只读属性的脚本

    脚本内容入下: 其中脚本中 "/d"作用 (可以用来改变当前驱动器目录) 例如:   我现在是在D盘,现在我要切换到C:\windows目录  脚本参数中 ATTRIB -R /S ...

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

    SVN是我认为目前最方便的版本管理体系.我最早一次接触版本管理是2004年,当时学校BBS的代码要求用CVS管理:第二次亲密接触是在2006年,当时公司的代码使用Eclipse+CVS管理:而第一次使 ...

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

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

  7. 再谈windows下创建特殊文件夹

    记得05年9月份刚刚开始学计算机的时,那时候买了本书,书名不记得了,反正是跟hacker有关皮毛书,成天砖严里面的内容.这也是后来为什么会选择念计算机专业的原因.扯远了,言归正传. 书的内容,其中有一 ...

  8. windows下批量生成文件夹

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

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

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

最新文章

  1. CN.Text开发笔记—利用反射将数据读入实体类
  2. HashMap源码分析1:添加元素
  3. homebrew可以管理众多开源软件的安装和卸载
  4. linux安装python3.6以后报错处理
  5. Android Volley框架的使用(二)
  6. boot分布式计算 spring_腾讯T4大佬剖析SpringBoot2 :从搭建小系统到架构分布式大系统...
  7. 【Gradle】配置详解(持续更正补充)
  8. 极路由 1S 使用经验
  9. 案例 实现文件读写器 c# 1614523907
  10. 用matlab画牛顿迭代图形,matlab牛顿迭代动画演示
  11. graphpad做饼图_走进隆江糖饼老店,探秘绿豆饼制作过程
  12. Win10出现跟这台计算机连接的一个usb设备运行不正常怎么办
  13. 网站导航颜色停留_提高网站流量的方法有哪些?
  14. Git(9)-- 远程仓库的使用
  15. 【收藏版】长文详解基于并行计算的条件随机场
  16. mysql水平分表实践记录_MYSQL 分表实践
  17. linux远程控制本地用户登录,linux 本地无法登录 远程可以登陆的解决办法
  18. Error launching Console Application PDFLaTeX
  19. jquery weui 图片浏览器Photo Browser 如何使用?
  20. 32位计算机怎么安装ps,我可以在64位系统上安装32位Photoshop吗?

热门文章

  1. 我的CSDN博客正式登陆
  2. “浏览器设置从上次停下的地方继续,但是电脑重启打开后还是主页”问题的解决办法
  3. UI设计汪汪Yuki丨云沃客工作经验分享
  4. 力荐几本学习MCSE的经典好书
  5. 多伦多大学好吗_大家对多伦多大学有什么评价?
  6. 如何看待清华段子手“毕导”毕啸天至今没有发表过高质量论文?
  7. python matplotlib 绘制堆叠图
  8. CSS,给你点“颜色“看看
  9. 大连云计算产业为10万中小企业建起“云平台”
  10. 电影《可可西里》散记