既然到了后台,只要你有权限就可以为所欲为了!
创建文件夹
//fs.js var fs = require('fs'); fs.mkdirSync('a', 0755); fs.mkdirSync('a/b', 0755); fs.mkdirSync('a/b/c', 0755);
那么它会在fs.js所在目录中创建一个a目录,a目录下再创建b目录,b目录下创建c目录。mkdirSync是一个同步方法,拥有三个参数,第一个是路径,第二个是目录权限,第三个是回调
但这样做有点不妥,如果指定目录已存在,就报错。如果要建立多级目录,一层层判定此目录是否存在,立即会陷入“回调地狱”的境地。虽然node.js对于IO操作的方法都提供了两个版本,一个是同步的,一个是异步的。想了想,搞出我自己的mkdirSync函数,实现比mkdirp的作者好很多。
var fs = require('fs'); function mkdirSync(url,mode,cb){ var path = require("path"), arr = url.split("/"); mode = mode || 0755; cb = cb || function(){}; if(arr[0]==="."){//处理 ./aaa arr.shift(); } if(arr[0] == ".."){//处理 ../ddd/d arr.splice(0,2,arr[0]+"/"+arr[1]) } function inner(cur){ if(!path.existsSync(cur)){//不存在就创建一个 fs.mkdirSync(cur, mode) } if(arr.length){ inner(cur + "/"+arr.shift()); }else{ cb(); } } arr.length && inner(arr.shift()); } //测试代码 mkdirSync("aaa/ddd/dd",0,function(e){ if(e){ console.log('出错了'); }else{ console.log("创建成功") } });
有关目录的创建的讨论,详见这里
创建文件与写入内容
创建文件的方法fs.open(path, flags, [mode], [callback])好像所有语言都很一致,可能是想与最原始的C语言的方法保持一致。这是个异步方法,其同步版本,与其他同步方法一样,就是少了个回调。说一下flags中w与a的不同,w会把已存在的同名文件删除再创建一个,因此要注意。
fs.open("test.txt", "w");
写入内容。这有几种方法,比如fs.write,不过它的第一个参数要求类型为Buffer,而fs.openSync不是返回一个Buffer,因此它不能与fs.write配合使用。
//fs.js var fs = require('fs'); fs.open("test.txt","w",0644,function(e,fd){ if(e) throw e; fs.write(fd,"first fs!",0,'utf8',function(e){ if(e) throw e; fs.closeSync(fd); }) });
这时,我们就创建一个文本文件,里面写入"first fs"。不过open中间那两个参数的不是必要的。我们可以再搞一个fs2.js脚本
//fs2.js var fs = require('fs'); fs.open("test.txt","a",0644,function(e,fd){ if(e) throw e; fs.write(fd,"second fs!",function(e){ if(e) throw e; fs.closeSync(fd); }) });
执行它,它会在test.txt追加"second fs"这句话。
fs的open, write, close有点像我们在浏览器对document的操作。此外,还有fs.writeFile与fs.writeFileSync,可惜它们不能做追加内容的操作。
var fs = require('fs'); fs.writeFile("test.txt","third fs!",function(e){//会先清空原先的内容 if(e) throw e; })
删除目录或文件
var fs = require('fs'); fs.rmdir("aaa",function(e){ if(e){ console.log(e) } }) /** { stack: [Getter/Setter], arguments: undefined, type: undefined, message: 'ENOTEMPTY, Directory not empty \'aaa\'', errno: 39, code: 'ENOTEMPTY', path: 'aaa' } */
报错,缘由是之前我们还为aaa创建了子目录,必须逐个删除,实在不人性化,于是又造了一个轮子。
var fs = require('fs'); var rmdirSync = (function(){ function iterator(url,dirs){ var stat = fs.statSync(url); if(stat.isDirectory()){ dirs.unshift(url);//收集目录 inner(url,dirs); }else if(stat.isFile()){ fs.unlinkSync(url);//直接删除文件 } } function inner(path,dirs){ var arr = fs.readdirSync(path); for(var i = 0, el ; el = arr[i++];){ iterator(path+"/"+el,dirs); } } return function(dir,cb){ cb = cb || function(){}; var dirs = []; try{ iterator(dir,dirs); for(var i = 0, el ; el = dirs[i++];){ fs.rmdirSync(el);//一次性删除所有收集到的目录 } cb() }catch(e){//如果文件或目录本来就不存在,fs.statSync会报错,不过我们还是当成没有异常发生 e.code === "ENOENT" ? cb() : cb(e); } } })(); rmdirSync("aaa",function(e){ console.log("!!!"+e) console.log("删除aaa目录以及子目录成功") })
上面的rmdirSync还可以分解出一个方法,取得给定目录下的所有目录与文件。
var fs = require('fs'); var getAllFolersAndFiles = (function(){ function iterator(url, folders, files){ var stat = fs.statSync(url); if(stat.isDirectory()){ folders.unshift(url);//收集目录 inner(url,folders, files); }else if(stat.isFile()){ files.unshift(url);//收集文件 } } function inner(path,folders,files){ var arr = fs.readdirSync(path); for(var i = 0, el ; el = arr[i++];){ iterator(path+"/"+el,folders,files); } } return function(dir){ var folders = [], files = []; try{ iterator(dir,folders,files); }catch(e){ }finally{ return { folders : folders, files : files } } } })()
如果我们只想取得指定目下的所有文件,还可以更精简些!
function getAllFiles(root) { var result = [], files = fs.readdirSync(root) files.forEach(function(file) { var pathname = root+ "/" + file , stat = fs.lstatSync(pathname) if (stat === undefined) return // 不是文件夹就是文件 if (!stat.isDirectory()) { result.push(pathname) // 递归自身 } else { result = result.concat(getAllFiles(pathname)) } }); return result }
监听文件的改动
就是使用watchFile及其同步版本。
var fs = require("fs"), sys = require("util"); fs.open("aaa.js","w",0644,function(e,fd){ fs.writeSync(fd,"console.log(1111);"); fs.closeSync(fd); }) fs.watchFile("aaa.js", function(curr, prev) { sys.puts("\n\ttest_file.txt has been edited"); sys.puts("\tThe current mtime is: " + curr.mtime); sys.puts("\tThe previous mtime was: " + prev.mtime + "\n"); }); fs.open("aaa.js","a",0644,function(e,fd){ fs.writeSync(fd,"console.log(2222)"); fs.closeSync(fd); });
此外,node.js还提供了修改了目录文件权限的操作,但这些都是不值一提。自己看看文档就会了。
转自:http://www.cnblogs.com/rubylouvre/archive/2011/11/28/2264717.html
相关推荐
Node.js操作MySQL和MongoDB;基于Node.js的Myweb框架的基本设计架构及实现;利用Myweb框架实现一个简单的Web聊天室;在线聊天室案例和在线中国象棋案例的实现;Node.js的日志模块、curl模块、crontab模块、forever...
主要介绍了Node.js文件操作详解,本文讲解了处理文件路径讲的一些方法、fs模块详细的使用和介绍等内容,需要的朋友可以参考下
draxt.js – 一个工具模块,用于在Node.js环境中选择和操作文件系统对象
你可以从 Node.js 的官方网站下载适合你操作系统的安装程序,并按照说明进行安装。 步骤 2:创建一个新的 Node.js 文件 在你的代码编辑器中,创建一个新的文件,并将其保存为 server.js。 步骤 3:编写代码 在 ...
同步的形式会阻塞 Node.js 事件循环和进一步的 JavaScript 执行,直到操作完成。 异常会被立即地抛出,可以使用 try…catch 处理,也可以冒泡。 const fs = require('fs'); try { fs.unlinkSync('文件'); ...
Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是...Node.js也是JS的一种运行环境,node.js为JS提供操作文件、创建http服务、创建TCP、UDP服务等接口,所以Node.js可以完成其他后台语言能完成的工作。
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
主要介绍了node.js文件操作,结合实例形式详细分析了node.js针对文件的读取、写入、删除、遍历、监控等各种常见操作技巧,需要的朋友可以参考下
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
本源码项目是基于Node.js和Express的MySQL数据库操作设计,包含23个文件,主要使用JavaScript编程语言。该项目展示了如何使用Express框架连接MySQL数据库,并进行基本的CRUD(创建、读取、更新、删除)操作。系统...
当 Node.js 执行 I/O 操作时(例如从网络读取、访问数据库或文件系统),Node.js 会在响应返回时恢复操作,而不是阻塞线程并浪费 CPU 循环等待。 这使 Node.js 可以在一台服务器上处理数千个并发连接,而无需引入...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
本文给大家汇总了node.js实现文件操作的方法,非常的细致全面,希望大家能够喜欢
本项目是基于Node.js开发的PDMan开源数据库模型建模工具设计源码,主要使用JavaScript进行开发。项目共包含259个文件,其中JavaScript源代码文件92个,CSS样式文件83个,LESS样式文件33个,PNG图片文件14个,JSON...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...