模块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)的更多相关文章

  1. PHP判断文件夹是否存在和创建文件夹的方法(递归创建多级目录)

    在开始之前,我先说明一下,可能许多朋友与我一样认为只要给一个路径,mkdir就可以创建文件夹,其实不是那样,单个的MKDIR只能创建一级目录,对于多级的就不行了,那如何用mkdir来创建呢?先我抄一段 ...

  2. github创建文件夹

      网页上只能通过在创建新文件的时候顺便创建文件夹(文件夹与文件用 / 隔开),例如home/test.md就在该仓库下创建了一个文件夹home,该文件夹下有一个新的文件test.md

  3. windows环境下创建 .文件夹

    一.windows环境下创建 .文件夹 1.新建一个文件夹 2.重命名为.properties.(名字前后都加点) 二.windows环境下创建 .文件 1.上面的方法对文件同样适用 2.运行CMD, ...

  4. Java 判断文件夹、文件是否存在、否则创建文件夹

    1.判断文件是否存在,不存在创建文件 File file=new File("C:\\Users\\QPING\\Desktop\\JavaScript\\2.htm"); if( ...

  5. C#创建文件夹

    string path = Server.MapPath("~/DefaultImg/newDir/63/");//获取文件路径 if (!Directory.Exists(pat ...

  6. 用SQL语句建库建表建约束(用SQl语句在指定盘符创建文件夹)

    一 :创建数据库 创建一个数据文件和一个日志文件(MySchool) create database MySchoolon primary      --默认属于primary主文件组,可省略(--数 ...

  7. mkdir:批量创建文件夹

    问题:mkdir dir[0-9]创建文件夹时,并没有如预期创建dir0~dir9这几个文件夹,而是创建了dir[0-9]这一个文件夹. 网上看了些相关资料,发现以前对[0-9]的理解不够透彻: &q ...

  8. php中如何创建文件夹

    这个功能比较简单,直接上代码了: $dir = iconv("UTF-8", "GBK", "Public/bookcover"); if ...

  9. eclipse 向HDFS中创建文件夹报错 permission denied

    环境:win7  eclipse    hadoop 1.1.2 当执行创建文件的的时候, 即: String Path = "hdfs://host2:9000"; FileSy ...

随机推荐

  1. phpstorm内网远程debug

    家里用的是广电的网络,接了无线路由,在192.168.1.1里面配置了端口转发,将9001转发到192.168.1.101 ,然后在php.ini中相应的配置了xdebug, phpstorm 启动监 ...

  2. Func<T,T>应用之Elasticsearch查询语句构造器的开发

    前言 之前项目中做Elasticsearch相关开发的时候,虽然借助了第三方的组件PlainElastic.Net,但是由于当时不熟悉用法,而选择了自己拼接查询语句.例如: string queryG ...

  3. javascript性能优化总结二(转载)

    上面一篇文章大致介绍了一些javascript当中使用的一些小技巧,当下这篇文章继续介绍一下内存管理.松散耦合.性能方面的一些小知识.为避免错误应该注意的点 内存管理 1.循环引用 如果循环引用中包含 ...

  4. 小调网 经典电影 豆瓣评分 tampermonkey脚本

    // ==UserScript== // @name 小调网 // @namespace http://tampermonkey.net/ // @version 0.1 // @descriptio ...

  5. windows server2012 r2 上 安装 IIS8.5

    一时间不知道怎么开头了,直接上图吧! 本人技术不高,正在学习中, 要是有 喜欢 .Net,觉得酷的,欢迎来 QQ群  316497348  交流分享!

  6. Hibernate getCurrentSession()和openSession()的区别

    通过getCurrentSession()创建的Session会绑定到当前线程上:openSession()不会. 通过getCurrentSession()获取Session,首先是从当前上下文中寻 ...

  7. [Tex学习]编号

    \documentclass{ctexart}\usepackage{enumerate}\begin{document}\begin{enumerate}[{case}1]\item new\ite ...

  8. WebService---Android中访问WebService接口的方法

     最近公司有个项目需要从Android平台访问WebService接口,实现向发布的函数传递对象.在网上找了一些资料,发现使用ksoap2可以调用WebService传递对象.   需要引入ksoap ...

  9. 理解Python装饰器

    装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权 ...

  10. mac与php环境

    一.目录 apache目录:/etc/apache2/ mysql目录:/usr/local/mysql/ 站点目录:/Library/WebServer/Documents/ 二.mac系统给文件夹 ...