Как узнать путь к папке Windows с помощью Node - PullRequest
0 голосов
/ 17 мая 2018

Мне нужно получить доступ к данным конфигурации для каждого компьютера в моем приложении Node, работающем в Windows.Я нашел эту документацию о том, как найти местоположение:

Где я должен хранить свои данные и файлы конфигурации, если я нацеливаюсь на несколько версий ОС?

Итак, вВ моем случае я бы хотел получить путь для CSIDL_COMMON_APPDATA (или FOLDERID_ProgramData).Тем не менее, все примеры написаны на C, и я бы предпочел не писать для этого расширение C.

Есть ли другой способ доступа к этим путям из Node, или я должен просто жестко их кодировать?

1 Ответ

0 голосов
/ 17 мая 2018

Проведя небольшое исследование, я обнаружил, что можно вызвать соответствующий процесс Windows API. (SHGetKnownFolderPath), чтобы получить эти местоположения папок, см. Документы по адресу: https://msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs.85).aspx.

Мы вызываем APi, используя модуль FFI npm: https://www.npmjs.com/package/ffi.

Здесь можно найти GUID для любой известной папки: https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx

Вот скрипт, который находит расположение нескольких общих папок, часть кода немного хакерская, но ее легко очистить.

const ffi = require('ffi');
const ref = require('ref');

const shell32 = new ffi.Library('Shell32', {
    SHGetKnownFolderPath: ['int', [ ref.refType('void'), 'int', ref.refType('void'), ref.refType(ref.refType("char"))]]
});

function parseGUID(guidStr) {
    var fields = guidStr.split('-');
    var a1 = [];
    for(var i = 0; i < fields.length;  i++) {
        var a2 = [...Buffer.from(fields[i], 'hex')];
        if (i < 3) a2 = a2.reverse();
        a1 = a1.concat(a2);
    }
    return new Buffer(a1);
}

function getWindowsKnownFolderPath(pathGUID) {
    let guidPtr = parseGUID(pathGUID);
    guidPtr.type = ref.types.void;

    let pathPtr = ref.alloc(ref.refType(ref.refType("void")));

    let status = shell32.SHGetKnownFolderPath(guidPtr, 0, ref.NULL, pathPtr);
    if (status !== 0) {
        return "Error occurred getting path: " + status;
    }

    let pathStr = ref.readPointer(pathPtr, 0, 200);
    return pathStr.toString('ucs2').substring(0, (pathStr.indexOf('\0\0') + 1)/2);
}

// See this link for a complete list: https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx 
const WindowsKnownFolders = {
   ProgramData: "62AB5D82-FDC1-4DC3-A9DD-070D1D495D97",
   Windows: "F38BF404-1D43-42F2-9305-67DE0B28FC23",
   ProgramFiles: "905E63B6-C1BF-494E-B29C-65B732D3D21A",
   Documents: "FDD39AD0-238F-46AF-ADB4-6C85480369C7"
}

// Enumerate common folders.
for(let [k,v] of Object.entries(WindowsKnownFolders)) {
   console.log(`${k}: `, getWindowsKnownFolderPath(v));   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...