对于我相当新的OSX,当你有一个文件路径时,可以使用fs.stat()来测试目标是文件还是目录。
但是,我想知道的是目录是否是应用程序包。我认为测试扩展名是否为“.app”是不够安全的。我需要查看“文件夹”中是否有一个plist或??
确定文件夹是否实际上是“可执行”包最安全的方法是什么?
感谢。
答案 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') );