2015-10-26 5 views
1

Я запускаю приложение nodewebkit, и я хочу искать папку для псевдонимов.Инициаторы Finder не распознаются как символические ссылки на Mac с node.js

Следующий код работает, но не распознает псевдонимы папок или псевдонимы файлов как символические ссылки.

Где я ошибаюсь?

var path = '/Users/test/Desktop/testfolder'; 
    var fs = require('fs'); 
    fs.readdir(path, function(err, files) { 
     if (err) return; 
     files.forEach(function(f) { 
      var newPath = path + '/' + f; 
      console.log("looking for "+ newPath +" symlink: "+fs.lstatSync(path).isSymbolicLink()); 
      fs.lstat(newPath, function(err, stats){ 
       if(err){ 
        console.log(err); 
       } 
       if(stats.isFile()){ 
        console.log('is file mofo',f); 
       } 
       if(stats.isDirectory()){ 
        console.log('is Directory mofo',f); 
       } 
       if(stats.isSymbolicLink()){ 
        console.log('is symbolic link'); 
       } 
      }); 
     }); 
    }); 
+0

Вы говорите о псевдонимах _Finder.app_? Они специфичны для этого приложения и технически отличны от символических ссылок - для этого, я полагаю, для этого вам понадобится библиотека, специфичная для OS X. – mklement0

+0

Да, это то, что я только что узнал. Использование mdfind - это способ, но я считаю, что разумнее просто использовать swift. thx – Silve2611

+0

Если делегирование командам оболочки является опцией - которая, очевидно, медленная - возможно обнаружить псевдонимы Finder (подумайте об этом: это то, что вы подразумеваете при использовании 'mdfind'); из любопытства: как бы вы использовали 'mdfind'? Как вы планируете использовать Swift вместо этого? – mklement0

ответ

1

Finder псевдонимы на OS X технологически отличаются от симлинок.

С точки зрения файловой системы они являются обычными файлами, и только сам Finder и API-интерфейсы OS X знают, как обращаться с ними: Node.js не имеет встроенного API для этого.

IF взывает к оболочке - которая будет медленно - это вариант, вы можете попробовать следующее:

function isFinderAlias(path) { 
    var contentType = require('child_process') 
     .execFileSync('mdls', 
      [ '-raw', '-name', 'kMDItemContentType', path ], { encoding: 'utf8' }) 
    return contentType === 'com.apple.alias-file' 
} 

Для -На пути swift к решимости нашедших псевдоним к его целевому пути , см. this answer.

+0

thx good answer. но я не могу быть уверенным, что xcode или command-line всегда установлены. Stillt right – Silve2611

+1

@ Silve2611: Я заменил функцию на один на основе «mdls», который является стандартной утилитой (не требует установки) - надеюсь, что это поможет. – mklement0

+0

отличное решение! Большое спасибо! – Silve2611