Windows下新建多级文件夹
- 使用system函数调用系统命令"md"
注意:字符串变量的话赋值时要使用双斜杠"\\":
system("md C:\\newfolder\\");
如果需要动态新建目录的话:
char *path = "C:\\newfolder\\";
char swap[255];
sprintf(swap, "md %s", path);
system(swap);
不用判断返回值,系统会自动将错误信息打印到标准输出上.
- _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;
}
}
- 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>}
- MakeSureDirectoryPathExists()
这绝对是一个暴力的函数,啥都不说了,直接用:
MTVERIFY(MakeSureDirectoryPathExists(path));
别忘了加上两句:
#include <ImageHlp.h>
#pragma comment(lib, "ImageHlp.lib")
加上一点:该函数强制要求参数字符串以反斜杠'\'结尾,如果不以'\'结尾,最后一层文件夹不会建立.
- 最后再说几个判断文件夹是否存在的方法
- PathFileExists() 可以判断文件或者文件夹是否存在:
if (PathFileExists(path)) {...}
- 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>}
- 和上面相似,使用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下新建多级文件夹相关推荐
- windows下批处理删除文件夹、删除文件、if exist用法
windows下批处理删除文件夹.删除文件.if exist用法 开发中用到Window批处理del.rd.if exist,总结用法便于后续使用. windows下批处理删除文件: * 使用del指 ...
- 系统运维系列 之在Windows下可以查看文件夹大小的工具TreeSize Free
给大家推荐一个在Windows下可以查看文件夹大小的工具TreeSize Free. 下载链接: https://customers.jam-software.de/downloadTrial.php ...
- 如何用python新建文件夹_用Python编写一个每天都在系统下新建一个文件夹的脚本...
这个程序的功能非常的简单,就是每天在系统中新建一个文件夹.文件夹即当前的时间.此代码是在同事那边看到的,为了锻炼下自己薄弱的Python能力,所以花时间重新写了一个.具体代码如下: import ti ...
- 自定义windows下自动清除文件夹或者文件的只读属性的脚本
脚本内容入下: 其中脚本中 "/d"作用 (可以用来改变当前驱动器目录) 例如: 我现在是在D盘,现在我要切换到C:\windows目录 脚本参数中 ATTRIB -R /S ...
- Windows下删除.svn文件夹的最简易方法
SVN是我认为目前最方便的版本管理体系.我最早一次接触版本管理是2004年,当时学校BBS的代码要求用CVS管理:第二次亲密接触是在2006年,当时公司的代码使用Eclipse+CVS管理:而第一次使 ...
- Windows下删除.svn文件夹的简易方法
建立一个文本文件,取名为kill-svn-folders.reg(扩展名由txt改为reg),内容如下: Windows Registry Editor Version 5.00[HKEY_LOCAL ...
- 再谈windows下创建特殊文件夹
记得05年9月份刚刚开始学计算机的时,那时候买了本书,书名不记得了,反正是跟hacker有关皮毛书,成天砖严里面的内容.这也是后来为什么会选择念计算机专业的原因.扯远了,言归正传. 书的内容,其中有一 ...
- windows下批量生成文件夹
在windows环境下如果想要批量生成文件夹: 1.创建一个记事本文件 2.首行大写MD 3.后面加上你想创建的文件夹的名字,每个名字之间有空格 4.退出记事本并保存 5.将记事本文件后缀改为bat文 ...
- Windows 下自动同步文件夹内容到另一个文件夹下
实现windows 使用bat脚本文件,复制文件夹到另一个盘,参考如下代码:/y是可以不显示:提示你需要覆盖一个文件,如下图: bat文件内容为 @echo off echo "使用bat脚 ...
最新文章
- CN.Text开发笔记—利用反射将数据读入实体类
- HashMap源码分析1:添加元素
- homebrew可以管理众多开源软件的安装和卸载
- linux安装python3.6以后报错处理
- Android Volley框架的使用(二)
- boot分布式计算 spring_腾讯T4大佬剖析SpringBoot2 :从搭建小系统到架构分布式大系统...
- 【Gradle】配置详解(持续更正补充)
- 极路由 1S 使用经验
- 案例 实现文件读写器 c# 1614523907
- 用matlab画牛顿迭代图形,matlab牛顿迭代动画演示
- graphpad做饼图_走进隆江糖饼老店,探秘绿豆饼制作过程
- Win10出现跟这台计算机连接的一个usb设备运行不正常怎么办
- 网站导航颜色停留_提高网站流量的方法有哪些?
- Git(9)-- 远程仓库的使用
- 【收藏版】长文详解基于并行计算的条件随机场
- mysql水平分表实践记录_MYSQL 分表实践
- linux远程控制本地用户登录,linux 本地无法登录 远程可以登陆的解决办法
- Error launching Console Application PDFLaTeX
- jquery weui 图片浏览器Photo Browser 如何使用?
- 32位计算机怎么安装ps,我可以在64位系统上安装32位Photoshop吗?
热门文章
- 我的CSDN博客正式登陆
- “浏览器设置从上次停下的地方继续,但是电脑重启打开后还是主页”问题的解决办法
- UI设计汪汪Yuki丨云沃客工作经验分享
- 力荐几本学习MCSE的经典好书
- 多伦多大学好吗_大家对多伦多大学有什么评价?
- 如何看待清华段子手“毕导”毕啸天至今没有发表过高质量论文?
- python matplotlib 绘制堆叠图
- CSS,给你点“颜色“看看
- 大连云计算产业为10万中小企业建起“云平台”
- 电影《可可西里》散记