Web前端学习笔记——NodeJS之文件操作、全局成员、PATH路径操作

目录

文件操作

同步和异步

常用 API

案例:Markdown 文件转换器

文件操作的路径

文件操作的相对路径问题

全局成员

__dirname 和 filename

path 路径操作模块

path.basename

path.dirname

path.extname

path.parse

path.format(pathObject)

path.join

path.isAbsolute

path.normalize(path)


文件操作

参考文档:https://nodejs.org/dist/latest-v9.x/docs/api/fs.html

同步和异步

对于文件操作,Node 几乎为所有的文件操作 API 提供了同步操作和异步操作两种方式。

  • 同步会阻塞程序的执行,效率低(知道就行)
  • 异步相当于多找了一个人帮你干活,效率高
  • 所以建议:尽量使用异步

常用 API

API 作用 备注
fs.access(path, callback) 判断路径是否存在  
fs.appendFile(file, data, callback) 向文件中追加内容  
fs.copyFile(src, callback) 复制文件  
fs.mkdir(path, callback) 创建目录  
fs.readDir(path, callback) 读取目录列表  
fs.rename(oldPath, newPath, callback) 重命名文件/目录  
fs.rmdir(path, callback) 删除目录 只能删除空目录
fs.stat(path, callback) 获取文件/目录信息  
fs.unlink(path, callback) 删除文件  
fs.watch(filename[, options][, listener]) 监视文件/目录  
fs.watchFile(filename[, options], listener) 监视文件

案例:Markdown 文件转换器

需求:用户编写 md 格式的文件,实时的编译成 html 文件

使用 Node 提供的 API 结合 EcmaScript 6 语法

文件操作的路径

// 相对于当前路径
fs.readFile('./README.md')

// 相对当前路径,可以省略 ./
// 注意:加载模块中的标识路径不能省略 ./
fs.readFile('README.md')

// 绝对路径
fs.readFile('c:/README.md')

// 绝对路径,当前 js 脚本所处磁盘根目录
fs.readFile('/README.md')

文件操作的相对路径问题

建议:以后操作文件使用相对路径都使用 path.join() 方法结合 __dirname 来避免问题。

全局成员

参考文档:https://nodejs.org/dist/latest-v9.x/docs/api/globals.html

  • Class: Buffer
  • __dirname
  • __filename
  • clearImmediate(immediateObject)
  • clearInterval(intervalObject)
  • clearTimeout(timeoutObject)
  • console
  • exports
  • global
  • module
  • process
  • require()
  • setImmediate(callback[, ...args])
  • setInterval(callback, delay[, ...args])
  • setTimeout(callback, delay[, ...args])

__dirname 和 filename

在每个模块中,除了 requireexports 等模块相关 API 之外,还有两个特殊的成员:

  • __dirname 动态获取 可以用来获取当前文件模块所属目录的绝对路径
  • __filename 动态获取 可以用来获取当前文件的绝对路径
  • __dirname 和 __filename 是不受执行 node 命令所属路径影响的

在文件操作中,使用相对路径是不可靠的,因为在 Node 中文件操作的路径被设计为相对于执行 node 命令所处的路径(不是bug,人家这样设计是有使用场景)。

所了为了解决这个问题,很简单,只需要把相对路径变为绝对路径就可以了。

那这里我们就可以使用 __dirname 或者 __filename 来帮我们解决这个问题了。

在拼接路径的过程中,为了避免手动拼接带来的一些低级错误,所以推荐多使用:path.join() 来辅助拼接。

所以为了尽量避免刚才所描述这个问题,大家以后在文件操作中使用的相对路径都统一转换为 动态的绝对路径

补充:模块中的路径标识和这里的路径没关系,不受影响(相对于文件模块)

path 路径操作模块

参考文档:https://nodejs.org/dist/latest-v9.x/docs/api/path.html

path 是 Node 本身提供的一个核心模块,专门用来处理路径。

使用它的第一步就是先加载:

const path = require('path');

path.basename

获取一个路径的文件名部分

path.basename('/foo/bar/baz/asdf/quux.html');
// Returns: 'quux.html'

path.basename('/foo/bar/baz/asdf/quux.html', '.html');
// Returns: 'quux'

path.dirname

获取一个路径的目录部分

path.dirname('/foo/bar/baz/asdf/quux');
// Returns: '/foo/bar/baz/asdf'

path.extname

获取一个路径的后缀名部分

path.extname('index.html');
// Returns: '.html'

path.extname('index.coffee.md');
// Returns: '.md'

path.extname('index.');
// Returns: '.'

path.extname('index');
// Returns: ''

path.extname('.index');
// Returns: ''

path.parse

将一个路径转换为一个对象,得到路径的各个组成部分

path.parse('/home/user/dir/file.txt');
// Returns:
// { root: '/',
//   dir: '/home/user/dir',
//   base: 'file.txt',
//   ext: '.txt',
//   name: 'file' }

path.format(pathObject)

将具有特定属性的对象转换为一个路径

// If `dir`, `root` and `base` are provided,
// `${dir}${path.sep}${base}`
// will be returned. `root` is ignored.
path.format({
  root: '/ignored',
  dir: '/home/user/dir',
  base: 'file.txt'
});
// Returns: '/home/user/dir/file.txt'

// `root` will be used if `dir` is not specified.
// If only `root` is provided or `dir` is equal to `root` then the
// platform separator will not be included. `ext` will be ignored.
path.format({
  root: '/',
  base: 'file.txt',
  ext: 'ignored'
});
// Returns: '/file.txt'

// `name` + `ext` will be used if `base` is not specified.
path.format({
  root: '/',
  name: 'file',
  ext: '.txt'
});
// Returns: '/file.txt'

path.join

将多个路径拼接为一个

path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// Returns: '/foo/bar/baz/asdf'

path.join('foo', {}, 'bar');
// throws 'TypeError: Path must be a string. Received {}'

path.isAbsolute

判断一个路径是否是绝对路径

Unix:

path.isAbsolute('/foo/bar'); // true
path.isAbsolute('/baz/..');  // true
path.isAbsolute('qux/');     // false
path.isAbsolute('.');        // false

Windows:

path.isAbsolute('//server');    // true
path.isAbsolute('\\\\server');  // true
path.isAbsolute('C:/foo/..');   // true
path.isAbsolute('C:\\foo\\..'); // true
path.isAbsolute('bar\\baz');    // false
path.isAbsolute('bar/baz');     // false
path.isAbsolute('.');           // false

path.normalize(path)

将一个非标准路径标准化

path.normalize('/foo/bar//baz/asdf/quux/..');
// Returns: '/foo/bar/baz/asdf'

path.normalize('C:\\temp\\\\foo\\bar\\..\\');
// Returns: 'C:\\temp\\foo\\'

##path.resolve([...paths])

类似于 path.join() ,也是用来路径拼接

path.resolve('/foo/bar', './baz');
// Returns: '/foo/bar/baz'

path.resolve('/foo/bar', '/tmp/file/');
// Returns: '/tmp/file'

path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');
// if the current working directory is /home/myself/node,
// this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'

 

发布了296 篇原创文章 · 获赞 562 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/tichimi3375/article/details/82842634