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

时间:2013-03-26 06:32:14

标签: node.js path directory filesystems fs

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

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

6 个答案:

答案 0 :(得分:493)

fs.lstatSync(path_string).isDirectory()应该告诉你。来自docs

  

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

stats.isFile()
stats.isDirectory()
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isSymbolicLink() (only valid with fs.lstat())
stats.isFIFO()
stats.isSocket()

答案 1 :(得分:40)

更新: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);
        }
})();

任何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()}`);
});

使用同步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
   }
}

答案 2 :(得分:11)

严重的是,问题存在了五年,没有很好的门面吗?

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;
    }
}

答案 3 :(得分:6)

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

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

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

const path = require('path');

function isFile(pathItem) {
  return !!path.extname(pathItem);
}

答案 4 :(得分:1)

上面的答案检查文件系统是否包含文件或目录的路径。但这不能确定给定路径本身是文件还是目录。

  

答案是使用“ /”标识基于目录的路径。就像->“ / c / dos / run /”。 <-跟踪期。

就像尚未写入的目录或文件的路径。或来自另一台计算机的路径。或同时存在同名文件和目录的路径。

SELECT 
    COUNT(*) AS none 
FROM 
    college_votes 
WHERE 
    `bd` IN ('none', '-Select for Board of Director-') 
    AND `bd1` IN ('none', '-Select for Board of Director-') 
    AND `bd2` IN ('none', '-Select for Board of Director-') 
    AND `bd3` IN ('none', '-Select for Board of Director-')

节点版本:v11.10.0-2019年2月

  

最后的想法:为什么还要打文件系统?

答案 5 :(得分:0)

这是我在某些程序中使用的独立功能。这篇文章中没人利用promisifyawait/async功能,所以我想我会分享。

const isDirectory = async path => {
  try {
    return (await require('util').promisify(require('fs').lstat)(path)).isDirectory()
  } catch (e) {
    return false // or custom the error
  }
}

注意:我不使用require('fs').promises;,因为它已经试验了一年,而不是依赖它。