Node.js / io.js:OSX如何检查文件路径目标是否是应用程序包?

时间:2015-07-31 08:52:02

标签: node.js

对于我相当新的OSX,当你有一个文件路径时,可以使用fs.stat()来测试目标是文件还是目录。

但是,我想知道的是目录是否是应用程序包。我认为测试扩展名是否为“.app”是不够安全的。我需要查看“文件夹”中是否有一个plist或??

确定文件夹是否实际上是“可执行”包最安全的方法是什么?

感谢。

2 个答案:

答案 0 :(得分:1)

使用命令行实用程序mdls。在其输出中,查找字符串com.apple.application-bundle

jaanus@jk-mbp ~> mdls -name kMDItemContentTypeTree /Applications/TextEdit.app
kMDItemContentTypeTree = (
    "com.apple.application-bundle",
    "com.apple.application",
    "public.executable",
    "com.apple.localizable-name-bundle",
    "com.apple.bundle",
    "public.directory",
    "public.item",
    "com.apple.package"
)

您可以在Node中执行此操作:

exec = require('child_process').exec;
exec("mdls -name kMDItemContentTypeTree /Applications/TextEdit.app", function(error, stdout, stderr) {
  if (stdout.match(    "com.apple.application-bundle")) {
    console.log("is app bundle");
  } else {
    console.log("is NOT app bundle");
  }
});

答案 1 :(得分:0)

我认为测试目录是否为应用程序包的唯一正确方法是阅读Info.plist文件以检查CFBundlePackageType是否设置为APPL

使用plist的简单PoC:

var fs    = require('fs');
var plist = require('plist');

var isApplication = function(dir) {
  try {
    var obj = plist.parse(fs.readFileSync(dir + '/Contents/Info.plist', 'utf8'));
    return obj.CFBundlePackageType === 'APPL';
  } catch(e) {
    return false;
  }
};

console.log( isApplication('/Applications/Mail.app') );
console.log( isApplication('/tmp') );