如何使用JavaScript读取和写入文件

任何人都可以提供示例代码来读写使用JavaScript的文件?

为了完整性,OP没有声明他正在浏览器中执行此操作(如果他是,如前所述,通常是不可能的)

但是,JavaScript本身确实允许这个; 它可以完成与服务器端的JavaScript。

在Javascript File类中看到这个文档

编辑 :该链接是现在已被Oracle移动的Sun文档。

为了跟上时代的步伐,下面是FileSystem类的node.js文档: http : //nodejs.org/docs/latest/api/fs.html

编辑(2) :您现在可以用HTML5读取客户端文件: http : //www.html5rocks.com/en/tutorials/file/dndfiles/

不。浏览器端的JavaScript没有权限写入客户端机器,没有很多安全选项被禁用

这是mozilla的build议

http://www-archive.mozilla.org/js/js-file-object.html

这是用spidermonkey中的编译开关实现的,也是在adobe的extensionscript中实现的。 另外(我想)你在Firefox扩展中的File对象。

犀牛有一个(相当粗鲁的)readFile函数https://developer.mozilla.org/en/Rhino_Shell

对于更复杂的犀牛文件操作,可以使用java.io.File方法。

你不会在浏览器中得到这些东西。 对于浏览器中的类似function,您可以使用HTML5,客户端持久性,Cookie和闪存存储对象中的SQL数据库function。

未来在这里! 提议接近完成,没有更多的ActiveX或Flash或Java。 现在我们可以使用:

  • 文件系统API

  • 本地拖放文件访问

您可以使用“拖放”function将文件导入浏览器或简单的上传控件。 一旦用户select了一个文件,你可以阅读它的Javascript: http : //www.html5rocks.com/en/tutorials/file/dndfiles/

这个Javascript函数为通过浏览器运行的用户提供了一个完整的“另存为”对话框。 用户按下确定,文件被保存。

编辑:下面的代码只适用于IE浏览器,因为Firefox和Chrome已经考虑到这个代码的安全问题,并阻止它的工作。

 // content is the data you'll write to file<br/> // filename is the filename<br/> // what I did is use iFrame as a buffer, fill it up with text function save_content_to_file(content, filename) { var dlg = false; with(document){ ir=createElement('iframe'); ir.id='ifr'; ir.location='about.blank'; ir.style.display='none'; body.appendChild(ir); with(getElementById('ifr').contentWindow.document){ open("text/plain", "replace"); charset = "utf-8"; write(content); close(); document.charset = "utf-8"; dlg = execCommand('SaveAs', false, filename+'.txt'); } body.removeChild(ir); } return dlg; } 

调用该function:

 save_content_to_file("Hello", "C:\\test"); 

如果您使用JScript(Microsoft的Javascript)使用WSH(不在浏览器中!)执行本地脚本,则可以使用Scripting.FileSystemObject来访问文件系统。

我认为你可以访问IE中的同一个对象,如果你closures了很多安全设置,但这是一个非常非常糟糕的主意。

MSDN在这里

对于Firefox:

 var file = Components.classes["@mozilla.org/file/local;1"]. createInstance(Components.interfaces.nsILocalFile); file.initWithPath("/home"); 

请参阅https://developer.mozilla.org/en-US/docs/Code_snippets/File_I_O

对于其他人,请查看TiddlyWiki应用程序,看看它是如何做到的。

在浏览器的上下文中,Javascript可以读取用户指定的文件。 请参阅Eric Bidelman的博客 ,了解有关使用File API读取文件的详细信息。 但是,基于浏览器的Javascript不能禁用本地计算机的文件系统而不禁用某些安全设置,因为它被认为是任何网站任意更改本地文件系统的安全威胁。

说,有一些方法来解决它,取决于你想要做什么:

  1. 如果它是你自己的网站,你可以在网页中embedded一个Java Applet。 但是,访问者必须在本地机器上安装Java,并且会收到有关安全风险的警告。 访问者必须允许加载小程序。 Java Applet就像一个可以完全访问本地计算机的可执行软件。

  2. Chrome支持本地文件系统的沙盒部分的文件系统。 详情请参阅此页面 。 这可能为您暂时保存本地的东西。 但是,这不被其他浏览器支持。

  3. 如果你不限于浏览器,Node.js有一个完整的文件系统接口。 看到这里的文件系统文件 。 请注意,Node.js不仅可以运行在服务器上,还可以运行在包括windows在内的任何客户端计算机上。 javascripttesting运行器Karma基于Node.js. 如果你只是喜欢在本地计算机上的JavaScript编程,这是一个选项。

目前,文件可以使用File , FileWriter和FileSystem API从浏览器选项卡/窗口的上下文中进行书写和读取,尽pipe存在对其使用的注意事项(请参阅此答案的尾巴)。

但要回答你的问题:

使用BakedGoods *

写入文件:

 bakedGoods.set({ data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}], storageTypes: ["fileSystem"], options: {fileSystem:{storageType: Window.PERSISTENT}}, complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){} }); 

读取文件:

 bakedGoods.get({ data: ["testFile"], storageTypes: ["fileSystem"], options: {fileSystem:{storageType: Window.PERSISTENT}}, complete: function(resultDataObj, byStorageTypeErrorObj){} }); 

使用原始文件,FileWriter和FileSystem API

写入文件:

 function onQuotaRequestSuccess(grantedQuota) { function saveFile(directoryEntry) { function createFileWriter(fileEntry) { function write(fileWriter) { var dataBlob = new Blob(["Hello world!"], {type: "text/plain"}); fileWriter.write(dataBlob); } fileEntry.createWriter(write); } directoryEntry.getFile( "testFile", {create: true, exclusive: true}, createFileWriter ); } requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile); } var desiredQuota = 1024 * 1024 * 1024; var quotaManagementObj = navigator.webkitPersistentStorage; quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess); 

读取文件:

 function onQuotaRequestSuccess(grantedQuota) { function getfile(directoryEntry) { function readFile(fileEntry) { function read(file) { var fileReader = new FileReader(); fileReader.onload = function(){var fileData = fileReader.result}; fileReader.readAsText(file); } fileEntry.file(read); } directoryEntry.getFile( "testFile", {create: false}, readFile ); } requestFileSystem(Window.PERSISTENT, grantedQuota, getFile); } var desiredQuota = 1024 * 1024 * 1024; var quotaManagementObj = navigator.webkitPersistentStorage; quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess); 

只是你要求的权利? 也许,也许不是。 后两个API:

  • 目前仅在基于Chromium的浏览器(Chrome&Opera)中实施
  • 已经取消了W3C的标准轨道,截至目前是专有的API
  • 将来可能会从实施的浏览器中删除
  • 将文件的创build限制在磁盘上的沙箱 (文件不能产生任何效果的位置)上

此外,FileSystem规范没有定义目录结构在磁盘上的显示方式。 例如,在基于Chromium的浏览器中,沙箱具有一个虚拟文件系统 (一个目录结构,它不一定以与在浏览器中访问时相同的forms存在于磁盘上),在该目录和文件中使用API被放置。

所以尽pipe你可以用API来将文件写入系统,但是find没有API的文件(没有FileSystem API)可能是一件不平凡的事情。

如果你能处理这些问题/限制,这些API几乎是你所要求的唯一的本地方式。

如果您对非本地解决scheme开放,Silverlight还允许通过IsolatedStorage从标签/窗口竞赛中获得文件I / O。 但是,需要使用托pipe代码才能使用此工具。 需要编写这样的代码的解决scheme超出了这个问题的范围。

当然,一个使用互补托pipe代码的解决scheme,只留下一个使用Javascript编写的代码,这个问题就在这个问题的范围之内;):

 //Write file to first of either FileSystem or IsolatedStorage bakedGoods.set({ data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}], storageTypes: ["fileSystem", "silverlight"], options: {fileSystem:{storageType: Window.PERSISTENT}}, complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){} }); 

* BakedGoods是一个Javascript库,它build立了一个统一的界面,可以用来在所有本地和一些非本地存储设施中进行常见的存储操作。 它由这个人在这里维护)。

创build文件尝试

 function makefile(){ var fso; var thefile; fso = new ActiveXObject("Scripting.FileSystemObject"); thefile=fso.CreateTextFile("C:\\tmp\\MyFile.txt",true); thefile.close() } 

在C驱动器中创build你的目录,因为Windows有安全性防止从networking写入,例如在C驱动器中创build名为“tmp”的文件夹。

你不能以任何跨浏览器的方式做到这一点。 IE确实有方法来启用“受信任”的应用程序来使用ActiveX对象来读/写文件,但这是不幸的。

如果您希望保存用户信息,则很可能需要使用Cookie。

你将不得不转向Flash,Java或Silverlight。 在Silverlight的情况下,您将看到独立存储 。 这将让你写在用户磁盘上自己的操场上的文件。 它不会让你写在你的游乐场之外。

你不能在客户端使用JavaScript文件I / O,因为这将是一个安全风险。 你必须让他们下载并运行一个EXE,或者如果这个文件在你的服务器上,使用AJAX和一个服务器端语言,比如PHP在服务器端执行I / O

这里是铬v52 +写入解决scheme(用户仍然需要select一个目的地母鹿…)
来源: StreamSaver.js

 <!-- load StreamSaver.js before streams polyfill to detect support --> <script src="StreamSaver.js"></script> <script src="https://wzrd.in/standalone/web-streams-polyfill@latest"></script> 
 const writeStream = streamSaver.createWriteStream('filename.txt') const encoder = new TextEncoder let data = 'a'.repeat(1024) let uint8array = encoder.encode(data + "\n\n") writeStream.write(uint8array) // must be uInt8array writeStream.close() 

最适合于编写客户端生成的大数据。
否则,我build议使用FileSaver.js保存Blob /文件