FS模块
Node.js fs模块(文件模块) 创建、删除目录(文件) 读取写入文件流
1 | /* |
FS-文件系统
fs 模块提供了一些 API,用于以一种类似标准 POSIX 函数的方式与文件系统进行交互。
所有的文件系统操作都有异步和同步两种形式。
异步
形式的 最后一个参数
都是完成时回调函数
。 传给回调函数的参数取决于具体方法,但回调函数的第一个参数都会保留给异常
。 如果操作成功完成,则第一个参数会是 null 或 undefined。
同步操作
当使用同步操作
时,任何异常都会被立即抛出,可以使用 try/catch
来处理异常,或让异常向上冒泡。
1 | const fs = require('fs'); |
异步操作
注意,异步的方法不能保证执行顺序。 所以下面的例子可能会出错,因为 fs.stat() 操作可能在 fs.rename() 操作之前完成。
建议
在繁忙的进程中,建议使用函数的异步版本。 同步的方法会阻塞整个进程,直到完成(停止所有连接)。
文件路径
大部分 fs
操作接受字符串
、Buffer
、或使用 file:
协议的 URL
对象作为文件路径。
相对路径
会相对于 process.cwd()
定义的当前工作目录进行处理。
使用 Buffer
定义的路径主要用于将文件路径处理为 opaque 字节序列的特定 POSIX 操作系统。 在这种系统上,一个文件路径可能包含使用多种字符编码的子序列。 与字符串路径一样,Buffer 路径也可以是相对的或绝对的。
注意 在 Windows 上 Node.js 遵循 per-drive 工作目录的理念。 当使用驱动器路径不带反斜杠时可以观察到该特性。 例如,fs.readdirSync(‘c:\‘) 可能会返回与 fs.readdirSync(‘c:’) 不同的结果。 详见 MSDN路径文档
支持 URL 对象
文件描述符
在 POSIX
系统,内核
为所有进程
维护着一张当前打开着的文件与资源表格
。 每个打开的文件都会分配一个名为文件描述符
的数值标识。
在系统层
,所有文件系统操作
使用这些文件描述符
来识别与追踪每个特定的文件。
Window 系统使用了一个不同但概念类似
的机制来追踪资源。
为方便用户,Node.js 抽象了不同操作系统间的差异
,为所有打开的文件分配了数值的文件描述符。
fs.open()
方法用于分配一个新的文件描述符。 一旦分配了,文件描述符可用于读取
数据、写入
数据、或查看
文件信息。
大多数操作系统
会限制打开的文件描述符的数量
,所以当操作完成时需关闭描述符
。 如果不这样做会导致内存泄漏
,最终造成应用奔溃。
线程池的使用
注意,所有文件系统 API 中,除了 fs.FSWatcher()
和那些显式同步的方法之外,都使用了 libuv
的线程池,这对于某些应用程序可能会产生出乎意料问题和负面的性能影响,详见 UV_THREADPOOL_SIZE
文档。
fs.FSWatcher 类
成功调用 fs.watch()
方法会返回一个新的 fs.FSWatcher
对象。
所有 fs.FSWatcher
对象都是 EventEmitter
的,每当监视的文件被修改时会触发 'change'
事件。
‘change’ 事件
eventType
\发生的变化事件的类型。 filename
\| \ 变化的文件名(如果是相关的或有效的)。
当被监视的目录或文件有变化时触发。 详见 fs.watch()
‘close’ 事件
当 watcher
停止监视文件变化时触发。 关闭的 fs.FSWatcher
对象在事件处理函数中不再可用。
‘error’ 事件
当监视文件发生错误时触发。
发生错误的 fs.FSWatcher
对象在事件处理函数中不再可用
。
watcher.close()
fs.FSWatcher
停止监视
文件的变化。
一旦停止,fs.FSWatcher
对象将不再可用
。
fs.ReadStream 类
成功调用 fs.createReadStream()
会返回一个新的 fs.ReadStream
对象。
fs.ReadStream
对象都是可读流。
‘close’ 事件
当 fs.ReadStream
底层的文件描述符被关闭时触发。
‘open’ 事件
‘ready’ 事件
readStream.bytesRead
已读取的字节数。
readStream.path
fs.Stats 类
fs.Stats
对象提供了一个文件的信息。
stats.isBlockDevice()
如果 fs.Stats
对象表示一个块设备,则返回 true 。
stats.isCharacterDevice()
如果 fs.Stats
对象表示一个字符设备,则返回 true 。
stats.isDirectory()
如果 fs.Stats
对象表示一个文件系统目录,则返回 true 。
stats.isFIFO()
如果 fs.Stats
对象表示一个先进先出 (FIFO) 管道
,则返回 true 。
FIFO( First Input First Output)简单说就是指先进先出。百度百科: FIFO存储器
stats.isFile()
如果 fs.Stats
对象表示一个普通文件,则返回 true
。
stats.isSocket()
如果 fs.Stats
对象表示一个 socket
,则返回 true
。
stats.isSymbolicLink()
如果 fs.Stats
对象表示一个符号链接,则返回 true
。
该方法只在使用 fs.lstat()
时有效。
stats属性
type | description |
---|---|
stats.dev | 包含文件的设备的数值型标识。 |
stats.ino | 文件系统特定的文件索引节点数值。 |
stats.mode | 表示文件类型与模式的位域。 |
stats.nlink | 文件的硬链接数量。 |
stats.uid | 文件拥有者的数值型用户标识。 |
stats.gid | 拥有文件的群组的数值型群组标识。 |
stats.rdev | 如果文件是一个特殊文件,则返回数值型的设备标识。 |
stats.size | 文件的字节大小。 |
stats.blksize | 文件系统用于 I/O 操作的块大小。 |
stats.blocks | 分配给文件的块的数量。 |
stats.atimeMs | 表示文件最后一次被访问 的时间戳。 |
stats.mtimeMs | 表示文件最后一次被修改 的时间戳。 |
stats.ctimeMs | 表示文件状态最后一次被改变 的时间戳。 |
stats.birthtimeMs | 表示文件的创建时间戳 。 |
stats.atime | 表示文件最后一次被访问 的时间。 |
stats.mtime | 表示文件最后一次被修改 的时间。 |
stats.ctime | 表示文件状态最后一次被改变 的时间。 |
stats.birthtime | 表示文件的创建 时间。 |
Stat 时间的值
略
fs.WriteStream 类
Node.js图片上传
[转]node.js 实现图片上传服务
使用multiparty插件实现上传
安装multiparty
npm i –save multiparty
代码实现
1 | const multiparty = require('multiparty'); |
构造参数说明
encoding
设置接收数据编码,默认是utf-8
maxFieldsSize
限制字段可以分配的内存量,默认2M
maxFields
限制在发出错误事件之前将要解析的字段数,默认1000
maxFilesSize
限制总文件大小,默认无穷大
autoFields
启用字段事件并禁用字段的部分事件。如果添加字段侦听器,则自动将其设置为true。
autoFiles
启用文件事件并禁用文件的部分事件。如果添加了一个文件侦听器,则自动将其设置为true。
uploadDir
文件上传的目录
如果回调提供,autofields
和autofiles
被设置为true
,所有字段和文件的收集和传递给回调,不再需要听任何形式的事件。
事件说明
- part 请求文件数据时触发,回调函数是一个实现可读流的实例对象
- headers:头部文件
- name:字段名称
- filename:文件名称
- byteFffset:主体数据的字节偏移量
- byteCount:数据总的字节长度