如何异步创建文件夹(node)
模块fs作为node的核心模块之一,支持本地文件操作的接口,几乎对于所有的操作都提供同步和异步两种方案。例如,创建文件夹有mkdir和mkdirSync。不论对于mkdir还是mkdirSync,都需要注意,只有当上级文件夹存在的时候才能创建文件夹。例如,在当前工作目录下创建dir1/dir2/dir3,需先创建dir1、dir2,才能创建dir3。
我们先使用同步mkdirSync的方法。
var fs=require('fs');
var path='dir1/dir2/dir3';
createDir(path);
function createDir(path){
var pathAry=path.split('/');
for (var i=0;i<pathAry.length;i++){
var curPath=pathAry.slice(0,i+1).join('/');
var isExist = fs.existsSync(curPath);
!isExist?fs.mkdirSync(curPath):null;
}
}
异步方法:
var fs=require('fs');
var path='dir1/dir2/dir3';
createDir(path);
function createDir(path){
var pathAry=path.split('/');
for (var i=0;i<pathAry.length;i++){
var curPath=pathAry.slice(0,i+1).join('/');
fs.exists(curPath,function(exists){
if (!exists){
fs.mkdir(curPath,function(){
console.log(curPath+' is created!');
});
}
})
}
}
但是第二种方法不能创建任何文件夹。问题在哪里呢?就在fs.exists里。它是异步的,当它的回调函数被执行的时候,外面的循环已经执行完毕,curPath变成了dir1/dir2/dir3。这时候,fs.mkdir(curPath,cb)由于以上提到的原因故而不能创建文件夹。这时候,我们可以利用闭包(自执行函数)来解决这个问题。
var fs=require('fs');
var path='dir1/dir2/dir3';
createDir(path);
function createDir(path){
var pathAry=path.split('/');
for (var i=0;i<pathAry.length;i++){
var curPath=pathAry.slice(0,i+1).join('/');
(function(curPath){ //将curPath传入闭包
fs.exists(curPath,function(exists){
if (!exists){
fs.mkdir(curPath,function(){
console.log(curPath+' is created!');
});
}
})
})(curPath);
}
}
当前路径curPath对于闭包来说是私有的,mkdir访问的就是当前作用域的curPath。
如何异步创建文件夹(node)的更多相关文章
- PHP判断文件夹是否存在和创建文件夹的方法(递归创建多级目录)
在开始之前,我先说明一下,可能许多朋友与我一样认为只要给一个路径,mkdir就可以创建文件夹,其实不是那样,单个的MKDIR只能创建一级目录,对于多级的就不行了,那如何用mkdir来创建呢?先我抄一段 ...
- github创建文件夹
网页上只能通过在创建新文件的时候顺便创建文件夹(文件夹与文件用 / 隔开),例如home/test.md就在该仓库下创建了一个文件夹home,该文件夹下有一个新的文件test.md
- windows环境下创建 .文件夹
一.windows环境下创建 .文件夹 1.新建一个文件夹 2.重命名为.properties.(名字前后都加点) 二.windows环境下创建 .文件 1.上面的方法对文件同样适用 2.运行CMD, ...
- Java 判断文件夹、文件是否存在、否则创建文件夹
1.判断文件是否存在,不存在创建文件 File file=new File("C:\\Users\\QPING\\Desktop\\JavaScript\\2.htm"); if( ...
- C#创建文件夹
string path = Server.MapPath("~/DefaultImg/newDir/63/");//获取文件路径 if (!Directory.Exists(pat ...
- 用SQL语句建库建表建约束(用SQl语句在指定盘符创建文件夹)
一 :创建数据库 创建一个数据文件和一个日志文件(MySchool) create database MySchoolon primary --默认属于primary主文件组,可省略(--数 ...
- mkdir:批量创建文件夹
问题:mkdir dir[0-9]创建文件夹时,并没有如预期创建dir0~dir9这几个文件夹,而是创建了dir[0-9]这一个文件夹. 网上看了些相关资料,发现以前对[0-9]的理解不够透彻: &q ...
- php中如何创建文件夹
这个功能比较简单,直接上代码了: $dir = iconv("UTF-8", "GBK", "Public/bookcover"); if ...
- eclipse 向HDFS中创建文件夹报错 permission denied
环境:win7 eclipse hadoop 1.1.2 当执行创建文件的的时候, 即: String Path = "hdfs://host2:9000"; FileSy ...
随机推荐
- 安装 Ghost 博客和 Nginx
Ghost 认 node 的版本,所以使用 nvm 更好. 1.安装 nvm: 可以去 github 查看 nvm 的说明,通过:wget -qO- https://raw.githubusercon ...
- Jenkins Job 自杀 groovy
下面的groovy可以加在post groovy script里面在job跑完的时候自杀(把本Job删掉) suicide_url="http://[USER]:[PASSWORD]@[JE ...
- 利用Jquery实现页面上div的拖动及位置保存
<script src="js/jquery.js.js" type="text/javascript"></script> <s ...
- NodeJS的小应用
server.js: //引入require 模块 var http=require('http'); //创建服务器 http.createServer(function(request,respo ...
- 三个loading小动画实例
直接贴代码: <!DOCTYPE html><html><head> <meta charset="utf-8"> &l ...
- 【maven】之使用tomcat7-maven-plugin自动编译的问题
今天遇到一个奇怪的问题,项目依赖关系如下, 在web端通过tomcat7插件debug模式启动项目的时候,dao层写的代码不能加载,还是原来的代码效果, 然后我在eclipse部署一个tomcat,将 ...
- 【学】CSS3的3D动画 ——3D旋转之骰子样式的钟表(2)上
这个是3D旋转的进阶版,是一个类似与骰子的正方体.这个版本只有秒数的个位数,还没有写整个钟表,下面那个版本好好想想该怎么写 这个效果需要用到transform-style: preserve-3d. ...
- 5、Linux 系统基本文件管理
1.Linux系统目录结构 /etc ----> 配置文件 /boot ----> 引导分区/挂载点, boot loader 的静态链接文件,存放与Linux启动相关的程序 ...
- Linux下*.tar.gz文件解压缩命令
1.压缩命令: 命令格式:tar -zcvf 压缩文件名.tar.gz 被压缩文件名 可先切换到当前目录下.压缩文件名和被压缩文件名都可加入路径. 2.解压缩命令: 命令格式:tar -z ...
- PHP 开发的 API 多版本管理实践
遇到的情况 本文针对移动互联网客户端需要兼容旧版的情况,强制升级到最新版本的 app 不在讨论之列. 在 bugtags.com 项目中,我们的版本遵循下面规范.1.0.1大功能.小更新.bug 修正 ...