如何异步创建文件夹(node)

模块fs作为node的核心模块之一,支持本地文件操作的接口,几乎对于所有的操作都提供同步和异步两种方案。例如,创建文件夹有mkdir和mkdirSync。不论对于mkdir还是mkdirSync,都需要注意,只有当上级文件夹存在的时候才能创建文件夹。例如,在当前工作目录下创建dir1/dir2/dir3,需先创建dir1、dir2,才能创建dir3。

我们先使用同步mkdirSync的方法。

 1 var fs=require(‘fs‘);
 2 var path=‘dir1/dir2/dir3‘;
 3 createDir(path);
 4 function createDir(path){
 5     var pathAry=path.split(‘/‘);
 6     for (var i=0;i<pathAry.length;i++){
 7         var curPath=pathAry.slice(0,i+1).join(‘/‘);
 8         var isExist = fs.existsSync(curPath);
 9         !isExist?fs.mkdirSync(curPath):null;
10     }
11 }

异步方法:

 1 var fs=require(‘fs‘);
 2 var path=‘dir1/dir2/dir3‘;
 3 createDir(path);
 4 function createDir(path){
 5     var pathAry=path.split(‘/‘);
 6     for (var i=0;i<pathAry.length;i++){
 7        var curPath=pathAry.slice(0,i+1).join(‘/‘);
 8           fs.exists(curPath,function(exists){
 9               if (!exists){
10                   fs.mkdir(curPath,function(){
11                       console.log(curPath+‘ is created!‘);
12                   });
13               }
14           })
15     }
16 }

但是第二种方法不能创建任何文件夹。问题在哪里呢?就在fs.exists里。它是异步的,当它的回调函数被执行的时候,外面的循环已经执行完毕,curPath变成了dir1/dir2/dir3。这时候,fs.mkdir(curPath,cb)由于以上提到的原因故而不能创建文件夹。这时候,我们可以利用闭包(自执行函数)来解决这个问题。

 1 var fs=require(‘fs‘);
 2 var path=‘dir1/dir2/dir3‘;
 3 createDir(path);
 4 function createDir(path){
 5     var pathAry=path.split(‘/‘);
 6     for (var i=0;i<pathAry.length;i++){
 7        var curPath=pathAry.slice(0,i+1).join(‘/‘);
 8         (function(curPath){ //将curPath传入闭包
 9             fs.exists(curPath,function(exists){
10                 if (!exists){
11                     fs.mkdir(curPath,function(){
12                         console.log(curPath+‘ is created!‘);
13                     });
14                 }
15             })
16         })(curPath);
17     }
18 }

当前路径curPath对于闭包来说是私有的,mkdir访问的就是当前作用域的curPath。

时间: 2025-01-18 23:24:58

如何异步创建文件夹(node)的相关文章

C#创建文件夹和文件

一.创建文件夹,例: 1 if (!Directory.Exists(path)) 2 { 3 Directory.CreateDirectory(path); 4 } 二.创建文件,例: 1 global::System.IO.FileInfo josnfile = new global::System.IO.FileInfo(JsonPath); 2 if (!josnfile.Exists) 3 { 4 // 创建map.json文件 5 FileStream fs = new FileS

自动创建文件夹的两种方法

自动创建文件夹的两种方法 1.CreateDictionary() CreateDirectory(myPath, 0); //在临时文件夹中创建本应用的文件夹 原型为:BOOL WINAPI CreateDirectory(__in  LPCTSTR lpPathName, __in LPSECURITY_ATTRIBUTES lpSecurityAttributes); 其中lpPathName是要创建的目录的路径,第2个涉及安全性问题 传NULL就好了 例如: char path[MAX_

iOS 创建文件夹,删除文件夹,对文件夹重命名的操作

iOS 创建文件夹,删除文件夹,对文件夹重命名的操作 by 伍雪颖 + (void)createFolder:(NSString *)folderName { NSString *imageDir = [NSString stringWithFormat:@"%@/Documents/%@", NSHomeDirectory(),folderName]; NSLog(@"HomeDir: %@",imageDir); BOOL isDir = NO; NSFileM

java文件操作 之 创建文件夹路径和新文件

一:问题 java 的如果文件夹路径不存在,先创建:如果文件名 的文件不存在,先创建再读写;存在的话直接追加写,关键字true表示追加 二:代码实现 package edu.tju.cs; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.RandomAccessFile; public c

C# 在本地创建文件夹及子文件夹

1 string dict = @"d:\估价报告\"; 2 if (!Directory.Exists(dict)) 3 { 4 Directory.CreateDirectory(dict); //创建文件夹 5 } 6 string subFolder = "subfolder"; 7 string pathString = System.IO.Path.Combine(dict, subFolder); 8 if (!System.IO.File.Exist

android下创建文件夹和修改其权限的方法

原文:http://www.cnblogs.com/wanqieddy/archive/2011/12/28/2304906.html 由于工作的需要,今天研究了在android下创建文件夹和修改其权限的方法,需要了解的是每个应用程序包都会有一个私有的存储数据的目录(类似文件夹),只有属于该包的应用程序才能写入该目录空间,每个包应用程序的私有数据目录位 于Android绝对路径/data/data/<包名>/目录中.除了私有数据目录应用程序还拥有/sdcard目录(即SD Card的写入权限,

CreateDirectory 创建文件夹

函数原型: CreateDirectory(  LPCTSTR lpPathName,   LPSECURITY_ATTRIBUTES lpSecurityAttributes); 简介: CreateDirectory 是Win32API函数,用于创建文件夹.     参数 lpPathName 表示路径    参数 lpSecurityAttributes 表示安全属性 =============================================================

cceditbox和cocostudio联合界面点击事件无响应问题,Android中创建文件夹问题

这两个问题折腾了我一天多时间,尽快下班时候把创建文件夹问题给解决了,刚把cceditbox点击事件无响应问题解决了.真是大爽. 1.创建文件夹 _mkdir()这个c函数就行,在vs ide中,定位的头文件是direct.h,但是这个文件不被ndk编译通过,没有这个文件.好吧,死脑筋,开始怀疑eclipse库路径设置有问题,但是不知道哪不对,搜索到了头大地步,好吧,认真仔细一看,原来是在ndk中,_mkdir函数放在了#include <sys/stat.h>中,改为这个头文件就行了. 2.点

java用流实现创建文件夹, 文件改名, 文件删除, 文件复制

创建TestFileManager类,在本类中分别创建factFile()方法(遍历文件夹中所有的文件).console()方法(换行).createFolder()方法(创建文件夹). renameFile()方法(改名).deleteFile()方法(删除文件).copyFile()方法(复制文件).showContent()(每一次操作完成重新输出所有文件): package com.maya.hanqi.filemanager; import java.io.BufferedReader