Node.js检查路径是文件还是目录

Tho*_*ggi 346 filesystems directory path fs node.js

我似乎无法获得任何解释如何执行此操作的搜索结果.

我想要做的就是能够知道给定的路径是文件还是目录(文件夹).

Jas*_*ske 554

fs.lstatSync(path_string).isDirectory()应该告诉你.来自文档:

从fs.stat()和fs.lstat()返回的对象属于这种类型.

stats.isFile()
stats.isDirectory()
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isSymbolicLink() (only valid with fs.lstat())
stats.isFIFO()
stats.isSocket()
Run Code Online (Sandbox Code Playgroud)

  • 请记住,如果目录或文件不存在,那么您将收到错误. (43认同)
  • 请注意,如果您关心常规应用程序性能,则通常更喜欢异步版本. (16认同)
  • ```让isDirExists = fs.existsSync(dirPath)&& fs.lstatSync(dirPath).isDirectory();``` (8认同)
  • 我觉得奇怪的是,当他们第一次制作 lstat 时,他们不只是在其中包含一个 contains() 函数?我想这就是为什么node_modules比黑洞更深的原因。 (2认同)
  • 为什么每个人都使用“fs.lstat()”?文档说它总是“false”:“如果`<fs.Stats>`对象是从`fs.lstat()`获得的,这个方法[`<fs.Stats>.isDirectory()`]将始终返回“false”。这是因为“fs.lstat()”返回有关符号链接本身的信息,而不是它解析到的路径。 (2认同)

Mar*_*nde 50

更新:Node.Js> = 10

我们可以使用新的fs.promises API

实验此功能仍在积极开发中,并且在将来的任何版本中都会受到非向后兼容的更改甚至删除.建议不要在生产环境中使用该功能.实验功能不受Node.js语义版本控制模型的约束.

const fs = require('fs').promises;

(async() => {

        try {
            const stat = await fs.lstat('test.txt');
            console.log(stat.isFile());
        } catch(err) {
            console.error(err);
        }
})();
Run Code Online (Sandbox Code Playgroud)

任何Node.Js版本

以下是如何异步检测路径是文件还是目录的方法,这是节点中推荐的方法.使用fs.lstat

const fs = require("fs");

let path = "/path/to/something";

fs.lstat(path, (err, stats) => {

    if(err)
        return console.log(err); //Handle error

    console.log(`Is file: ${stats.isFile()}`);
    console.log(`Is directory: ${stats.isDirectory()}`);
    console.log(`Is symbolic link: ${stats.isSymbolicLink()}`);
    console.log(`Is FIFO: ${stats.isFIFO()}`);
    console.log(`Is socket: ${stats.isSocket()}`);
    console.log(`Is character device: ${stats.isCharacterDevice()}`);
    console.log(`Is block device: ${stats.isBlockDevice()}`);
});
Run Code Online (Sandbox Code Playgroud)

使用同步API时请注意:

使用同步表单时,会立即抛出任何异常.您可以使用try/catch来处理异常或允许它们冒泡.

try{
     fs.lstatSync("/some/path").isDirectory()
}catch(e){
   // Handle error
   if(e.code == 'ENOENT'){
     //no such file or directory
     //do something
   }else {
     //do something else
   }
}
Run Code Online (Sandbox Code Playgroud)


Zde*_*k F 21

如果您在迭代目录时需要这个(因为这就是我发现这个问题的方式):

从 Node 10.10+ 开始,fs.readdir有一个withFileTypes选项可以使其返回目录条目fs.Dirent而不是字符串。目录条目具有name属性和有用的方法(例如isDirectoryisFile),因此您不需要fs.lstat显式调用。

import { promises as fs } from 'fs';

// ./my-dir has two subdirectories: dir-a, and dir-b

const dirEntries = await fs.readdir('./my-dir', { withFileTypes: true });

// let's filter all directories in ./my-dir

const onlyDirs = dirEntries.filter(de => de.isDirectory()).map(de => de.name);

// onlyDirs is now [ 'dir-a', 'dir-b' ]
Run Code Online (Sandbox Code Playgroud)


lam*_*345 17

说真的,问题存在五年,没有好看的外观?

function is_dir(path) {
    try {
        var stat = fs.lstatSync(path);
        return stat.isDirectory();
    } catch (e) {
        // lstatSync throws an error if path doesn't exist
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 13

根据您的需求,您可能可以依赖于节点的path模块。

您可能无法访问文件系统(例如,尚未创建文件),并且可能要避免访问文件系统,除非您确实需要额外的验证。如果您可以假设要检查的内容遵循以下.<extname>格式,则只需查看名称即可。

显然,如果您要查找的文件没有扩展名,则需要确定文件系统。但请保持简单,直到您需要更复杂为止。

const path = require('path');

function isFile(pathItem) {
  return !!path.extname(pathItem);
}
Run Code Online (Sandbox Code Playgroud)

  • 显然,这不会在所有情况下都有效,但如果您可以做出所需的假设,它会比其他答案更快、更容易。 (3认同)
  • 该目录可以命名为“folder.txt”,这表示它是一个文件,或者该文件可以是没有扩展名的“LICENSE” (3认同)