如何异步创建文件夹(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 ...
随机推荐
- yii框架便利类CVarDumper使用
1.类文件位置:path/to/yiiframework/utils/CVarDumper.php 2.作用:CVarDumper is intended to replace the buggy P ...
- hdu2874 LCA
题意:现在有 n 个点与 m 条边的无向无环图,但是图不一定完全连通,边有各自的边权,给出多组询问,查询两点之间的路径权值和,或者输出两点不连通. 一开始有最短路的想法,但是由于询问有 1e6 组,做 ...
- 加速你的py.test, pytest-dist
URL: https://pypi.python.org/pypi/pytest-xdist 多线程跑测试 Command: py.test -d --tx 3*popen
- Extjs各版本的下载链接
Extjs的版本繁多,本文收集了Extjs各个版本的下载链接,包括官网和非官网的,以及各种汉化版api,欢迎大家下载分享. Extjs最新版下载链接:http://www.sencha.com/pro ...
- UIAutomator定位Android控件的方法
UIAutomator各种控件定位的方法. 1. 背景 使用SDK自带的NotePad应用,尝试去获得在NotesList那个Activity里的Menu Options上面的那个Add note菜单 ...
- [solr] - IKAnalyzer 扩展分词库
在solr中加入自己的扩展分词库方法: 参考文章: http://www.cnblogs.com/dennisit/archive/2013/04/07/3005847.html 1.在solr的we ...
- Hadoop学习15--编程相关
1.新版本:mapreduce包 2.job设置: a.JobName便于调试 b.FileInputFormat.addInputPath 添加输入路径,可添加多个:可以是具体文件,还可以是文件夹. ...
- 黄聪:如何关闭phpstorm的typo拼写检查
文件-设置-编辑器-inspections-spelling-typo
- UVA 753 UNIX 插头(EK网络流+Floyd传递闭包)
UNIX 插头 紫书P374 [题目链接]UNIX 插头 [题目类型]EK网络流+Floyd传递闭包 &题解: 看了书之后有那么一点懂了,但当看了刘汝佳代码后就完全明白了,感觉他代码写的好牛逼 ...
- iOS中定时器的使用
1. NSTimer 不是很精确 2.CADisplayLink 屏幕 3.通过GCD来实现定时间器 //定时循环执行事件 //dispatch_source_set_timer 方法值得一提的是最后 ...