最近接到了一个任务,要在nodejs后台读取一个非本地的远程文件,经过一阵研究,找到了方法。发现网上对这件事的文章比较少,就写了一下方法。

1.将一个远程电脑上的文件夹设定为共享文件夹。在win10上的设定方式如图所示:

 设定为共享文件夹之后,其他电脑可以根据IP访问该文件夹。现假设设定为共享文件夹的IP为192.168.0.1,文件夹名称为data。

2.在nodejs中使用fs模块读取文件。fs读取文件的异步方式为:

fs.readFile("\\\\192.168.0.1\\data\\data.txt", "utf-8",function (err, data) {
    if (err) {
        console.error(err);
        return;
    }
    console.log(data);
})

第一个参数为文件的路径,如果是远程共享文件夹,则IP要写为"\\192.168.0.1\"的格式(注意在字符串中反斜杠\会转义,所以要写成"\\");第二个参数为字符编码格式,缺省值为"utf-8",也可以不填;第三个参数为一个回调函数,该回调函数的2个输入参数为err:读取失败信息,读取成功时err为null。data:读取文件的内容,如果第二个参数为空,则类型为buffer格式,如果第二个参数设定为了某个字符编码格式,则data参数为字符串格式。

同步方式为:

var data = fs.readFileSync("\\\\192.168.0.1\\data\\data.txt", "utf-8");

第一个参数为文件路径,第二个参数为字符编码格式,缺省值为“utf-8”。注意,如果读取文件失败,该函数为崩溃,最好用try...catch...的方式引用。

3.在读取远程文件的时候,经常遇到由于没有输入远程IP的用户名和密码而无法访问的情况。但是nodejs的fs模块中又没有输入用户名和密码的地方,因此我们需要先建立与远程IP的连接。建立与远程IP的连接方式可以在文件浏览器中输入IP,然后在弹出的对话框中输入用户名和密码,也可以在cmd窗口输入指令:

net use \\IP地址 用户密码 /user:用户名

显然我们不太可能能在nodejs运行的时候访问文件浏览器并弹出对话框,输入用户名密码,因此需要使用nodejs调用cmd命令来建立与远程IP的连接。nodejs可以使用 child_process模块来实现,child_process模块有两种方式可以实现调用cmd命令,为exec和spawn。这里推荐使用spawn,因为使用exec有时候没法将cmd的输出字符串进行转码。

NodeJS 子进程提供了与系统交互的重要接口,其主要 API 有:

标准输入、标准输出及标准错误输出的接口;获取标准输入 child.stdin;获取标准输出 child.stdout;获取标准错误输出 child.stderr;获取子进程的PID:child.pid;提供生成子进程的重要方法:child_process.spawn(cmd, args=[], [options]);提供直接执行系统命令的重要方法:child_process.exec(cmd, [options], callback);提供杀死进程的方法:child.kill(signal='SIGTERM')

使用child_process的spawn调用cmd命令的方式为:

var spawn = require("child_process").spawn;
module.exports = function myTest() {
    return new Promise(function(resolve, reject) {
        var cmd = "ipconfig";
        var result = spawn('cmd.exe', ['/s', '/c', `net use \\192.168.0.1 admin001 /user:admin`]);
        result.on('close', function(code) {
            console.log('child process exited with code :' + code);
        });
        result.stdout.on('data', function(data) {
            console.log('stdout: ' + data);
        });
        result.stderr.on('data', function(data) {
            console.log('stderr: ' + data);
            reject(new Error(stderr.toString()));
        });
        resolve();
 
    });
};

使用该方式之后,就可以建立与192.168.0.1的连接,之后再用fs模块访问文件就不会因为用户名和密码而拒绝访问。这是我找到的读取远程文件的方式,不知道大家有没有更好的方式。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐