如何在OS X上使用node.js检测隐藏文件

时间:2015-08-09 02:02:11

标签: node.js macos hidden mode stat

我无法找到一种方法来检测OS X中带有节点(nodejs)的隐藏文件。

当然,我们可以轻松找到“.dot_hidden”文件,但在Mac上,有些文件/文件夹是“受保护”的系统文件,大多数用户都不应该这样做。在Finder GUI中,当强制通过“AppleShowAllFiles”显示隐藏文件时,它们是不可见的或灰色的。

我确实发现了对UF_HIDDEN的引用:0x8000:

https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemDetails/FileSystemDetails.html

使用节点的统计信息,我们可以返回2个额外的信息位,这些信息可以提供隐藏状态的线索:

mode: 33188,       // File protection.
ino: 48064969,     // File inode number. An inode is a file 
                      system data structure that stores 
                      information about a file.

我不是一个十六进制/二进制的人,但它看起来像抓住stat的“ino”属性,我们可以应用0x8000并确定文件是否被暗示为隐藏。

我在模式上使用0x8000掩码没有任何成功,但确实有一些ino。

这就是我所拥有的,检查“ino”返回0或1726,当它是1726时,该文件似乎与OS X中的隐藏文件相匹配。

var fs = require("fs");

var dir = "/";
var list = fs.readdirSync(dir);

list.forEach(function(f){

    // easy dot hidden files
    var hidden = (f.substr(0, 1) == ".") ? true : false;

    var ino = 0;
    var syspath = dir + "/" + f;
    if( ! hidden ){
        var stats = fs.statSync(syspath);

        ino = parseInt( stats.ino & 0x8000, 8);

        // ino yeilds 0 when hidden and 1726 when not?

        if(ino || dotted){
            hidden = true;
        }
    }

    console.log(syspath, hidden, ino);

});

所以我的问题是,如果我在ino值上正确应用0x8000掩码以获得正确的结果?

如何解析ino属性获取其中包含的所有其他标志?

1 个答案:

答案 0 :(得分:1)

inode编号(stats.ino)是唯一标识文件的编号;它与文件的隐藏状态无关。 (实际上,可以随时在文件上设置或清除隐藏标志,这不会改变inode编号。)

隐藏标志是st_flags结构中struct stat字段的一部分。不幸的是,它看起来并不像node.js fs模块公开这个值,所以如果你需要在Mac OS上获取这些信息,你可能需要shell stat shell实用程序X.(简短版本:stat -f%f file将打印文件的标志,以十进制表示。)