`
wenson
  • 浏览: 1051908 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

node.js 文件操作

阅读更多

既然到了后台,只要你有权限就可以为所欲为了!

创建文件夹

//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(v16.16.0) 安装包

    也可能更新了文件系统模块,提供更强大的文件操作能力。 安全方面,每个新版本都会修复已知的安全漏洞,确保用户在开发和运行应用程序时的数据安全。v16.16.0 也不例外,它应该包含了一系列的安全修复,降低了潜在...

    Node.js安装包和二进制文件

    这个压缩包包含了Node.js的安装文件以及相关的说明文档,适用于Windows操作系统。 标题中的"Node.js安装包和二进制文件"指的是这个压缩包内包含的两个主要内容:一个是Node.js的安装程序,另一个是Node.js的二进制...

    node.js官方v14.17.3-x64版本msi安装包【集成npm】

    此压缩包文件 "node-v14.17.3-x64.msi" 是专为64位操作系统设计的 Node.js 安装程序,通过 Microsoft Installer (MSI) 格式提供。MSI 文件是一种常见的 Windows 安装包格式,能够方便用户进行一键式安装,简化部署...

    node.js 安装包 10.16.3-x64

    Node.js 是一个开源、跨平台的JavaScript运行环境,它允许开发者在服务器端执行JavaScript代码,极大地拓宽了JavaScript的应用领域。10.16.3-x64 版本是 Node.js 的一个稳定版本,适用于64位操作系统。下面将详细...

    Welcome to Node.js v14.17.6..zip

    3. 示例代码:提供了一些示例脚本,展示如何在Node.js中编写基本的服务器、读写文件等操作,方便初学者学习。 4. 证书和配置文件:可能包含与安全相关的证书,以及默认的配置文件,供高级用户自定义设置。 5. 更新...

    Node.js windows 安装文件

    这个"Node.js windows 安装文件"是针对Windows操作系统设计的安装包,版本为0.12.3,且为64位系统优化。 在Windows上安装Node.js,首先需要访问官方网站(nodejs.org)下载适合操作系统的安装包。在本例中,文件名...

    Node.js-百度网盘不限速下载支持Windows和Mac

    在Node.js中,你可以使用JavaScript来处理服务器端的任务,比如创建HTTP服务器、读写文件系统、数据库操作等。 **HTTP工具** 标签“Node.js开发-HTTP工具”表明这个项目与HTTP协议有关。在Node.js中,我们可以使用...

    《Node入门一本全面地Node.js教程》PDF

    - **模块系统**:Node.js内置了强大的模块系统,使用`require`函数可以加载和使用模块,如`fs`用于文件操作,`http`用于创建HTTP服务器。 - **CommonJS**:Node.js遵循CommonJS规范,允许模块间的代码复用。 2. *...

    Node.js-draxt.js–一个工具模块用于在Node.js环境中选择和操作文件系统对象

    5. 流式操作:Node.js 中的文件操作常常涉及流(Stream),draxt.js 可能会集成流的概念,使得大文件处理更加高效,不会一次性加载整个文件到内存中。 6. 高级功能:draxt.js 可能还包含一些高级特性,比如文件过滤...

    基于node.js的文件管理系统源码.zip

    同步的形式会阻塞 Node.js 事件循环和进一步的 JavaScript 执行,直到操作完成。 异常会被立即地抛出,可以使用 try…catch 处理,也可以冒泡。 const fs = require('fs'); try { fs.unlinkSync('文件'); ...

    Node.js-深入理解Node.js核心思想与源码分析

    3. 文件系统操作:libuv封装了异步文件操作API,如读写文件、创建目录等,确保在I/O密集型任务中不阻塞主线程。 4. 网络编程:libuv提供了网络套接字接口,支持TCP、UDP和Unix域套接字,实现高效、非阻塞的网络通信...

    pdf版,Node.js开发实战详解

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它让JavaScript开发者可以在服务器端执行代码,打破了传统的JavaScript只能在浏览器端运行的限制。这本《Node.js开发实战详解》电子书,显然是为了帮助那些...

    Node.js-基于Electron的一个Node.js安装器

    压缩包中的"installer-master"很可能包含了整个项目的源代码,包括HTML、CSS、JavaScript文件,以及可能的Electron配置文件和Node.js脚本。开发者可以通过阅读源码来学习如何组织和编写这样的安装程序。源码中可能...

    Node.js初级+进阶

    通过实践这个例子,你可以更深入地理解Node.js如何处理网络请求和文件操作。 总结,Node.js以其独特的事件驱动和非阻塞I/O模式,为开发者提供了构建高性能网络应用的新途径。通过逐步学习和实践,从基本概念到实际...

    Node.js开发实战详解源代码

    Node.js操作MySQL和MongoDB;基于Node.js的Myweb框架的基本设计架构及实现;利用Myweb框架实现一个简单的Web聊天室;在线聊天室案例和在线中国象棋案例的实现;Node.js的日志模块、curl模块、crontab模块、forever...

    node.js源码 node-v21.0.0.tar.gz

    6. **文件系统(fs)**:Node.js提供了丰富的文件系统API,如读取、写入、创建、删除文件等,这些API都是非阻塞的,便于进行高效的文件操作。 7. **HTTP服务器**:Node.js内置了http模块,可以方便地创建高性能的...

    Node.js入门源代码及开发工具

    4. **文件系统操作**:Node.js提供了fs模块,可以用来读写文件、创建、删除目录,是文件操作的基础。 5. **模块化编程**:Node.js遵循CommonJS规范,学习如何编写和使用模块,可以提高代码复用性和可维护性。 6. *...

    node-v12.18.3-x64_nodejs_Node.js_

    5. **文件系统操作**:Node.js提供了丰富的API来操作文件系统,便于进行读写文件、创建目录等操作。 6. **HTTP服务器**:Node.js内置了HTTP模块,可以方便地搭建Web服务器,处理HTTP请求和响应。 标签“nodejs”和...

    Node.js资料包,5本电子书籍

    这本指南深入讲解了Node.js的核心概念,如模块系统、文件系统操作、HTTP服务器实现,以及如何编写异步代码。书中还探讨了npm(Node Package Manager)的使用,它是Node.js生态系统中的关键部分,用于管理和分享代码...

Global site tag (gtag.js) - Google Analytics