获取节点webkit中目录的完整路径

Get full path of a directory in node webkit

如何在 node webkit 应用程序中获取目录(不是当前工作目录)的绝对路径?

示例 (Mac OS) - 我在 Documents 中创建了一个名为 A 的文件夹。当我对文件系统目录条目执行 getDirectory 时,我只能得到 dir.fullPath which returns A

app.workspace.getDirectory(self.folderpath, {}, function(dir){
    if(dir) console.log('Dir: ', dir);
});

但我需要:~/Documents/A/ || c:\Users\Username\Documents

在我的应用程序中,用户可以 choose/create 一个他们想要的目录,我 store/read 来自该文件夹的数据。

绝对路径可能不是我需要的,但我想使用默认桌面应用程序打开文件(PDF、doc...):

function getCommandLine() {
    switch (process.platform) {
        case 'darwin' : return 'open';
        case 'win32' : return 'start';
        case 'win64' : return 'start';
        default : return 'xdg-open';
    }
}

var exec = require('child_process').exec;
var filepath = '...';
//dir.fullPath will throw: The file /A/example.pdf does not exist.

var child = exec(getCommandLine() + ' ' + filepath, function (error, stdout, stderr) {
    if (error) {
        console.error(`exec error: ${error}`);
            return;
    }
});
child.on('close', function (e) {
    console.log('E: ', e);
});

不确定我是否理解了这个问题。您可以使用 __dirname 来获取您正在执行的脚本的目录。参见:https://nodejs.org/docs/latest/api/globals.html#globals_dirname

从那里您可以使用相对路径来引用其他文件和文件夹。

示例文件夹结构:

/home/filippo/works/test/
├── subfolder
│   └── index.js
└── test.js

subfolder/index.js:

module.exports = {'folder': __dirname};

test.js:

var m = require("./subfolder/");

console.log("test.js running in: ", __dirname);
console.log("m module running in: ", m.folder);

运行 测试:

$ node test.js 
test.js running in:  /home/filippo/works/test
m module running in:  /home/filippo/works/test/subfolder

这是您要找的吗?

出于安全原因,您不能从网页访问系统目录-文件-所有内容的绝对路径。即使您尝试从 javascript 脚本(例如)访问特定文件目录,浏览器也会立即阻止您。

一个可能对您有用的解决方案是检索用户想要使用简单的 <input type="file"> 打开的文件,这样用户就可以 select 一个文件,而无需向您提供其绝对值路径;之后你可以将文件保存到服务器主机上,甚至是项目的本地目录,然后使用远程路径通过 exec 命令打开它。

实际上我最近发现(我不敢相信我一开始就错过了它但是),使用 chrome 文件系统你可以获得 "more readable" 路径信息用于显示目的。

根据您要执行的操作,您可能无法访问绝对位置,但至少您可以看到它是什么...

fileSystem.getDirectory(path, {}, function(dir){
    if(dir) console.log('This should return full path: ', dir.getDisplayPath());
    var fullpath = dir.getDisplayPath();

    //now with this, I can open any file I want via child process :)

    var child = exec(getCommandLine() + ' ' + fullpath, function (error, stdout, stderr) 
    //.......
});

有关 chrome 文件系统的更多信息 here