`

Node.Js之FS文件操作篇

    博客分类:
  • js
 
阅读更多
http://www.tuicool.com/articles/MFJvQz

写文件

googog 写文件的意思感觉是写一个文件,准确来说,这里的写文件是把数据写入到一个文件中,当文件不存在时会创建一个文件。那么细化来看,过程应该是先打开一个文件,如果文件不存在就创建一个新的文件,然后把数据写入这个文件。 look

this打开文件使用fs.open方法,写入数据使用fs.write方法,先做个例子。fuck

var fs = require("fs");
fs.open("new.txt","w",function(err,fd){
    var buf = new Buffer("你好啊");
    fs.write(fd,buf,0,buf.length,0,function(err,written,buffer){});
})
look首先打开文件new.txt,然后写入“你好啊”数据。说起来容易,同时发现这里有很多参数。下面将详细介绍open和write方法。yellow

fs.open(path, flags, callback)

lookfs.openSync(path,flags) 是同步方法,return fd,如果有错误直接throw抛出错误。googog

fuckpath 参数,表示要打开文件的路径,flags标志参数,它限制打开的文件是可读、可写或可读写等方式,callback(err,fd)回调方法中fd表示打开文件的文件描述符。这里不好理解的是flags标志参数。sex

bookflags 参数可使用标志:god

book"r" 表示,打开文件进行读取。如果该文件不存在,将发生异常。sex

god"r+" 表示,打开文件进行读取和写入。如果该文件不存在,将发生异常。book

god"rs" 与 "r" 一样,但采用同步方式,这个方式很消耗性能,一般情况下不会用到。fuck

god"rs+" 与 "r+" 一样,但采用同步方式,这个方式很消耗性能,一般情况下不会用到。fuck

yellow"w" 表示,打开文件进行写入。如果文件不存在会创建一个文件,这种写入方式会全部删除旧有的数据,然后再写入数据。sex

god"w+" 表示,打开文件进行读取和写入。如果文件不存在会创建一个文件,这种写入方式会全部删除旧有的数据,然后再写入数据。fuck

look"wx" 和 "w" 相同,不同的是它是独占模式。yellow

fuck"wx+" 和 "w+" 相同,不同的是它是独占模式。book

googog"a" 表示,打开文件进行追加,如果文件不存在会创建一个文件,这个模式不同于"w",它不会删除旧有的数据,而是会在后面追加数据。this

look"a+" 表示,打开文件进行追加和读取,如果文件不存在会创建一个文件,这个模式不同于"w",它不会删除旧有的数据,而是会在后面追加数据。googog

googog"ax" 和 "a" 相同,不同的是它是独占模式。book

god"ax+" 和 "ax" 相同,不同的是它是独占模式。googog

godOK!看起来好多,还是做一些例子吧。god

var fs = require("fs");
fs.open("new.txt","r",function(err,fd){
    var buf = new Buffer("你好啊");
    var c = fs.writeSync(fd,buf,0,buf.length,0);
    console.log(c)
})
look上面的例子,只是把"w"改成"r",前提是new.txt文件存在,运行后,会出现错误提示,大概意思是无权写入。yellow

Error: EPERM, operation not permitted
this原因不言而喻,"r"表示只能被读,而不能写入。god

god下面这个例子用于说明"a"追加 和 "w"写入模式的差异,这个例子前提是,有一个已存在的new.txt文件,文件内有“你好啊”数据。googog

sex"w"模式god

var fs = require("fs");
fs.open("new.txt","w",function(err,fd){
    var buf = new Buffer("1234");
    fs.writeSync(fd,buf,0,buf.length,0);
})
good运行后,打开new.txt内容是“1234”而旧有的数据消失了。yellow

good我们在把new.txt文件内容改成“你好啊”,然后把"w"改成"a",运行!this

var fs = require("fs");
fs.open("new.txt","a",function(err,fd){
    var buf = new Buffer("1234");
    fs.writeSync(fd,buf,0,buf.length,0);
})
god运行后,打开文件new.txt文件,内容是“你好啊1234”。look

fs.write(fd, buffer, offset, length, position, callback)

god fs.writeSync(fd, buffer, offset, length, position) 方法是同步写入,它返回写入多少bytes数量。 good

thisfd参数,文件描述符,通过fs.open得到。googog

godbuffer参数,是要写入的数据,Buffer对象,buffer尺寸的大小设置最好是8的倍数,效率较高。sex

googogoffset参数,要写入buffer的起始位置。god

booklength参数,要写入buffer的长度。通过offset和length规定buffer中那些数据应该被写入到文件。god

yellowposition参数,写入到文件的什么位置。good

thiscallback((err, written, buffer)回调方法,当出现异常会抛出err,written是写入了多少bytes,buffer写入的数据。googog

sexfs.open 打开了文件,当然使用后应该关闭close文件,通过fs.close(fd, callback)和fs.closeSync(fd)方法可以关闭打开的文件,这个方法比较简单,不再多说。good

book上面写入方法是通过open得到fd(文件描述符)然后再写入文件的方式,其实还有其他方法。googog

fs.writeFile(filename, data, [options], callback)

fuckfs.writeFileSync(filename, data, [options]) 同步方式。look

goodfilename String类型, 文件名称。sex

lookdata String | Buffer类型,要写入的数据。googog

googogoptions[可选] Objectl 类型,默认值 {encoding:"utf8",flag:"w"}sex

goodcallback(err) 回调函数god

var fs = require("fs");
fs.writeFile("myfile.txt","Javascript很赞",function(err){
    if(!err)
    console.log("写入成功!")
})
fs.appendFile(filename, data, [options], callback)

book fs.appendFileSync(filename, data, [options]) 同步方式。 this

googog参看 fs.writeFile 方法,差别就是 [options]的flag默认值是"a",所以它以追加方式写入数据。book

读文件

good有了前面的写文件,读文件就好办多了,还是老规矩,先写代码再做说明,但这次结合之前学到的,开发一个判断文件是否是png格式图片文件的程序。googog

sex假设当前目录下有个1.png文件,我们来判断这个文件是png图片。god

var fs = require("fs");
fs.open("1.png","r",function(err,fd){
  // PNG头部 8 bytes是固定的,来判断文件前8bytes。
  var header = new Buffer([137,80,78,71,13,10,26,10]);
  var buf = new Buffer(8);
  fs.read(fd,buf,0,buf.length,0,function(err,bytesRead,buffer){
    if(header.toString() === buffer.toString()){
      console.log("是PNG格式图片文件");
    }
  })
})
good分析这个程序,先是用fs.open打开1.png文件,然后header数据是PNG图片标识数据,位于PNG图片前8个bytes,只要读取1.png文件前8bytes数据,然后对比一下数据是否一致就可以了。fuck

fs.read(fd, buffer, offset, length, position, callback)

googogfs.read(fd, buffer, offset, length, position) 方法是同步写入,它返回读取了多少bytes数量。yellow

godfd参数,文件描述符,通过fs.open得到。sex

godbuffer参数,是把读取的数据写入这个对象,是个Buffer对象。this

thisoffset参数,写入buffer的起始位置。god

booklength参数,写入buffer的长度。good

godposition参数,文件的什么位置开始读。fuck

sexcallback(err,bytesRead, buffer)回调方法,当出现异常会抛出err,bytesRead是读取了多少bytes,buffer读取到的数据。yellow

yellow和写文件同样的,除了fs.read方式读取文件外,还有一个读取文件的方式。yellow

fs.readFile(filename, [options], callback)

goodfs.readFileSync(filename,[options]) 同步方式,retur读取到的数据。fuck

godfilename String类型,表示要读取的文件名this

yellowoptions[可选] Object类型,默认值是 {encoding:null,flag:"r"}god

lookcallback(err,data) 回调函数,data表示读取的数据。god

god例book

var fs = require("fs");
var data = fs.readFileSync("myfile.txt");
console.log(data.toString());
小结一下

this 读取和写入都有两种不同方式,一个是先open,然后操作读写,但需要手工调用fs.close关闭文件,这种方式适合于多次写入或读取。还有一次性服务的,writeFile/appendFile/readFile方法只是写入或读取一次,内部自动调用了fs.close方法。look

good上面两个小节内容稍微多了一点,以下几节内容相对轻松了,现在可以稍微休息一下。this

截断文件

googog截断文件,说白了就是把整个文件内容删除了,然后再加入new Buffer(len)的空数据,这个方法多数情况没什么用。以下是方法。god

godfs.ftruncate(fd, len, callback)fuck

godfs.ftruncateSync(fd, len)god

lookfs.truncate(path, len, callback)look

goodfs.truncateSync(path, len)god

this这些方法很简单,做个例子说明一下。googog

var fs = require("fs");
fs.open("myfile.txt","w",function(err,fd){
    fs.ftruncate(fd,5,function(err){
        console.log(err)
    })
})
fs.truncateSync("myfile.txt",5);
文件链接

god文件链接在“文件系统概述”中用官方口气介绍了一次。但通俗点更好理解,说白了就是为一个文件创建一个特殊的链接,这个链接看起来像是一个文件,和快捷方式很像,这样理解就可了,熟悉linux ln命令的对文件链接会很熟悉这个概念。this

googog还是先做实例,再说明。sex

var fs = require("fs");
fs.linkSync("file.txt","filelink.txt");
var fs = require("fs");
fs.link("file.txt","filelink.txt",function(err){
    console.log(err);
});
god上面代码是为file.txt文件创建个“链接文件”filelink.txt,创建成功后,如果更改其中任何一个文件,相应的那个文件都会改变。googog

更改文件的查看和更新时间

god这个很好理解,查看文件属性时,会看到文件的创建事件、更改时间、查看事件。看以下代码。look

var fs = require("fs");
fs.utimes(
    "file.txt",
    new Date("1982-2-2"),
    new Date("1988-5-5"),
    function(err){}
);
good上面代码的意思是,把file.txt文件的查看时间改成1982/2/2,最新更改时间改成1988/5/5。book

fs.utimes(path, atime, mtime, callback)

thisfs.utimesSync(path, atime, mtime) 同步方式yellow

godpath:String 更改的文件名字路径。look

googogatime:Date 查看时间。look

bookmtime:Date 更改时间。sex

lookcallback(err) 回调函数。fuck

fs.futimes(fd, atime, mtime, callback)

this fs.futimesSync(fd, atime, mtime)

good

googog和utimes方法一样,只不过第一个参数是 fd 文件描述符。good

监听文件

fuck参看:“文件夹操作”一节。look

god在“文件夹操作”一节介绍了一种监听方式,下面还有一种专门监听文件的方法。look

fs.watchFile(filename, [options], listener)

googog这个方法添加文件更改监听器。fuck

googogfilename:String 要监听的文件名。look

godoptions[可选]:Object,默认值是{ persistent: true, interval: 5007 } , persistent表示是否持久运作,这个意思是,true的时候当前process进程不会退出,如果是false,就不会阻止当前进程退出,不过可以使用 setInterval 方法模拟 persistent:true 。 interval 表示监听间隔,以毫秒为单位。sex

godlistener(currentStat,previousStat),监听器,一旦文件有变化就会触发这个回调函数,currentStat是更改后当前的文件状态,previousStat表示更改前的状态,这两个参数是fs.Stats类型。(参看“文件夹操作”一节)。look

fs.unwatchFile(filename, [listener])

this这个方法是停止监听的意思。yellow

godfilename 要停止监听的文件名。fuck

godlistener[可选],表示要停止监听的监听器。如果不指定,那么将会停止全部监听文件的监听器。googog

t

his例yellow

var fs = require("fs");
var handle1 = function(event,filename){
  console.log("1")
}
var handle2 = function(event,filename){
  console.log("2")
}
fs.watchFile("file.txt",handle1);
fs.watchFile("file.txt",handle2);

setTimeout(function(){
   fs.unwatchFile("file.txt",handle1);
},20000)
god这里有两个监听器 handle1和handle2,当更改file.txt内容时,终端会打印出1 2,当20秒之后,再次更改file.txt文件,会发现终端只打印出 2 ,因为handle1已经被撤销了。god
分享到:
评论

相关推荐

    Node.js windows 安装文件

    - **事件驱动**:Node.js的核心特性之一是其事件驱动模型,利用回调函数处理异步操作,提高了非阻塞I/O的效率。 - **V8引擎**:Node.js使用Google的V8 JavaScript引擎,使得JavaScript代码能以接近原生速度运行。 ...

    Welcome to Node.js v14.17.6..zip

    此外,Node.js集成了许多内置模块,如`fs`用于文件系统操作,`http`和`https`用于创建HTTP服务器,`path`帮助处理文件路径,以及`util`提供了各种实用的工具函数。 Node.js的生态系统丰富,拥有大量的第三方模块,...

    Node.js By Example

    Node.js的核心特性包括单线程事件循环、异步编程、模块系统以及强大的文件系统操作等。在本书中,你将学习如何利用这些特性来开发高效的应用程序。 1. **事件驱动编程**:Node.js采用事件驱动模型,当有I/O操作时,...

    Node.js入门教程.pdf

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,允许开发者使用 JavaScript 语言来编写服务器端代码。Node.js 的出现改变了传统的 Web 开发模式,使得开发者可以使用 JavaScript 语言来开发服务器端...

    Node.js-FirefoxSend文件共享实验允许您将加密文件发送给其他用户

    在 Node.js 中,文件系统(File System,简称 fs)模块是核心模块之一,用于提供与操作系统进行文件操作的接口。在“FirefoxSend 文件共享实验”中,Node.js 的文件系统模块起到了关键作用,它负责处理文件的上传、...

    node.js最新手册

    在Node.js中,API是应用程序编程接口,它提供了与操作系统、网络、文件系统等交互的工具和方法。例如,`fs`模块用于文件系统操作,`http`模块用于创建HTTP服务器,`net`模块则提供了TCP和UDP网络连接的功能。`chm`...

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

    基于node.js的文件管理系统源码.zipNode.js 提供一组可用于与文件系统进行交互(以类似于标准 POSIX 函数的方式)的模块 fs 。 使用方式: const fs = require('fs'); 所有的文件系统操作都具有同步的、回调的、...

    node.js实战 pdf+源码

    6. **文件系统操作**:Node.js提供了一系列用于操作文件系统的API,如fs模块,可以进行读写文件、创建目录等操作,是构建各种服务器端应用的基础。 7. **流(Stream)**:Node.js的流接口是处理大量数据的有效方式...

    Node.js硬实战 115个核心技巧.pdf

    4. **文件系统(File System,简称FS)**:Node.js提供了丰富的文件系统API,如读写文件、创建删除目录等。书中会详细讲解这些API的用法,以及如何处理文件流。 5. **网络编程**:Node.js的网络功能强大,包括HTTP...

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

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

    Node.js-textract从各种文件抽取文本的Node.js模块

    textract利用了Node.js的异步I/O特性,确保了在处理大量文件时的高效率和非阻塞操作。它通过识别不同的文件类型,调用相应的解析库来读取和解析文件内容。例如,对于PDF文件,textract可能使用`pdf2text`库;对于...

    node.js 追加写入 文件删除 打开与关闭 创建 读取 删除 修改.zip

    在Node.js中,文件操作是核心功能之一,它允许开发者高效地处理本地文件系统。本教程将深入探讨Node.js中的文件操作,包括追加写入、文件删除、打开与关闭、创建、读取、删除以及修改文件。我们将通过具体代码示例来...

    Node.js从入门到精通

    4. **文件系统操作**:fs模块提供了对本地文件系统的操作接口,如创建、读写、删除文件和目录,是Node.js进行文件操作的主要工具。 5. **路径处理**:path模块提供了处理文件和目录路径的实用函数,如解析、合并和...

    Node.js中常规的文件操作总结

    在Node.js中,进行文件操作的核心模块是`fs`,它提供了一系列的API来处理文件系统操作。Node.js的设计使得开发者能够以非阻塞的方式处理I/O操作,这对于构建高性能的网络应用至关重要。以下是关于Node.js中文件操作...

    node.js时钟案例

    此外,Node.js拥有丰富的模块系统,比如我们可以通过`fs`模块读取和写入文件,通过`http`模块创建服务器,以及通过`path`模块处理文件路径等。 在"node.js时钟案例"中,描述提到了三个关键方法: 1. **resolveCSS...

    新时期的node.js入门-李锴-书中示例代码

    《新时期的Node.js入门》是李锴在2018年1月出版的一本专为初学者准备的Node.js教程,旨在帮助读者快速掌握这个强大的JavaScript后端开发平台。本书通过丰富的示例代码,深入浅出地介绍了Node.js的基础知识和实际应用...

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

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

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

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

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

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

    Node.js初级+进阶

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

Global site tag (gtag.js) - Google Analytics