如何读取Javascript中的本地文件(从电子应用程序运行)

如何读取Javascript中的本地文件(从电子应用程序运行),javascript,file,methods,io,electron,Javascript,File,Methods,Io,Electron,我已经找了一个多小时了,我找不到我问题的答案。有没有一种方法可以只使用一个普通的旧文件URL从本地文件获取文本 我已经找到了许多通过文件输入HTML标签读取文件的方法,但我经历了难以置信的痛苦,找到了一个可以在我的PC上找到文件的代码示例,只使用简单的旧JS 代码将在电子应用程序中 我需要代码示例。大概是这样的: readFile("file:\\\\C:\path\to\file.txt","text/plain"); readFile(url,mim

我已经找了一个多小时了,我找不到我问题的答案。有没有一种方法可以只使用一个普通的旧文件URL从本地文件获取文本

我已经找到了许多通过文件输入HTML标签读取文件的方法,但我经历了难以置信的痛苦,找到了一个可以在我的PC上找到文件的代码示例,只使用简单的旧JS

代码将在电子应用程序中

我需要代码示例。大概是这样的:

readFile("file:\\\\C:\path\to\file.txt","text/plain");

readFile(url,mimetype){
 ....
}

如果我没有弄错的话,使用类似这样的东西应该可以与fs模块一起工作

fs.readFileSync("/path/to/file.txt");

如果你想在Electron中读取文件,你必须了解Electron应用程序的各个部分。简而言之,有一个主进程和一个渲染器进程。主进程拥有并被赋予使用节点模块的所有控制权,例如可以读取文件的模块。渲染器进程不应该有权访问
fs
模块,而是应该在需要使用
fs
模块的任何时候,请求主进程使用
fs
,然后返回结果

仅供参考,呈现程序是网页,电子应用程序的可见部分

这种通信称为IPC(进程间通信)。流程是:

  • 渲染器进程通过IPC向主进程发送消息
  • 主进程听到消息,然后读取带有
    fs
  • 内容/结果通过IPC发送回渲染器进程
  • 渲染器进程现在可以对文件中的数据执行它想要的操作
  • 下面是一个非常粗略的例子

    index.html

    
    标题
    //从主进程接收消息时调用
    window.api.receive(“fromMain”,(数据)=>{
    log(`Received${data}来自主进程`);
    });
    //向主进程发送消息
    send(“toMain”,“一些数据”);
    
    main.js

    const{
    应用程序,
    浏览器窗口,
    伊普曼
    }=要求(“电子”);
    常量路径=要求(“路径”);
    常数fs=要求(“fs”);
    //保留窗口对象的全局引用,如果不保留,则窗口将
    //当JavaScript对象被垃圾收集时,将自动关闭。
    让我们赢;
    异步函数createWindow(){
    //创建浏览器窗口。
    win=新浏览器窗口({
    宽度:800,
    身高:600,
    网络首选项:{
    nodeIntegration:false,//是Electron v5之后的默认值
    contextIsolation:true,//防止原型污染
    enableRemoteModule:false,//关闭远程
    preload:path.join(\uu dirname,“preload.js”)//使用预加载脚本
    }
    });
    //加载应用程序
    加载文件(path.join(uu dirname,“dist/index.html”);
    //代码的其余部分。。
    }
    应用程序打开(“就绪”,创建窗口);
    ipcMain.on(“toMain”,(事件,参数)=>{
    fs.readFile(“path/to/file”,(错误,数据)=>{
    //对文件内容做些什么
    //将结果发送回渲染器进程
    win.webContents.send(“fromMain”,responseObj);
    });
    });
    
    preload.js

    const{
    contextBridge,
    IPC渲染器
    }=要求(“电子”);
    //公开允许渲染器进程使用的受保护方法
    //在不公开整个对象的情况下使用IPC渲染器
    contextBridge.exposeInMainWorld(
    “api”{
    发送:(频道、数据)=>{
    //白名单频道
    设validChannel=[“toMain”];
    if(有效通道包括(通道)){
    发送(通道、数据);
    }
    },
    接收:(频道,函数)=>{
    设validChannel=[“fromMain”];
    if(有效通道包括(通道)){
    //故意剥离事件,因为它包含“发件人”
    on(channel,(event,…args)=>func(…args));
    }
    }
    }
    );
    
    免责声明:我是一本畅销书的作者,写了一篇关于如何使用
    fs
    在电子应用程序中读取文件的文章。我希望你能读一读,因为里面有更多的信息

  • 读取文件是使用节点完成的,不依赖于电子
  • 如果您有创建窗口的代码,请添加此代码
  • const fs=require(“fs”);
    函数readFile(fileURL,mimeType){
    //readfile不接受文件:\\\thing,因此我们将其删除
    const pathToFile=fileURL.replace(“文件:\\\\”,“”);
    fs.readFile(路径文件,mimeType,(错误,内容)=>{
    如果(错误){
    控制台日志(err);
    返回;
    }
    控制台日志(内容);
    })
    }
    readFile('C:\\Users\\\\Documents\\test.txt','utf8')
    //如果在windows上运行,则需要对路径使用双反斜杠
    //这里有一个例子regex可以做到这一点
    pathToFile=pathToFile.replace(/\\/,“\\\\\”)
    
    当我在web浏览器中尝试时,它似乎起作用了。。。我不熟悉FS,导入FS需要做些什么吗?是的,它是一个节点包“文件系统”,这是它的文档。
    const fs = require("fs");
    
    function readFile(fileURL,mimeType){
       //readfile does not accept the file:\\\ thing, so we remove it
       const pathToFile = fileURL.replace("file:\\\\",'');
    
       fs.readFile(pathToFile,mimeType,(err,contents)=>{
         if(err){
            console.log(err);
            return;
         }
         console.log(contents);
       })
    }
    
    readFile('C:\\Users\\<userAccount>\\Documents\\test.txt','utf8')
    //If your on windows you'll need to use double backslashes for the paths
    //here's an example regex to do that
    
    pathToFile = pathToFile.replace(/\\/,'\\\\')