如何使用JavaScript读写文件?

172 javascript file-io

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

Dan*_*man 63

为了完整起见,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/

  • 是否可以使用HTML5写入本地文件? (3认同)

Gar*_*eth 40

不可以.浏览器端的javascript没有权限写入客户端计算机而不必禁用许多安全选项

  • @marcgg:这使得这个答案不完整,而不是不正确.而且,让我们面对现实,这个答案很可能涵盖OP的用例. (44认同)
  • 如果OP计划在浏览器之外使用javascript,那么他们可能会提到它的情况并不常见.假设浏览器并非不合理(并且绝对不是不正确).+1(弥补marcgg的-1). (36认同)
  • -1,OP从未说过任何关于浏览器方面的内容 (27认同)
  • @LightnessRacesinOrbit downvote按钮并不意味着答案被认为是错误的.它的工具提示文本是"这个答案没用". (2认同)
  • @Mike — 不是在写这个答案的时候,默认情况下假设浏览器端 JS 仍然是合理的。 (2认同)

Tho*_*lds 16

未来就在这里!提案更接近完成,不再是ActiveX或Flash或java.现在我们可以使用:

您可以使用拖放操作将文件导入浏览器或简单的上传控件.用户选择文件后,您可以使用Javascript阅读:http://www.html5rocks.com/en/tutorials/file/dndfiles/


Bre*_*ton 14

这是mozilla提案

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

这是通过spidermonkey中的编译开关实现的,也是在adobe的extendscript中实现的.另外(我认为)你在firefox扩展中获得了File对象.

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

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

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


Tem*_*emp 12

此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;
}
Run Code Online (Sandbox Code Playgroud)

调用函数:

save_content_to_file("Hello", "C:\\test");
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解决方案但是,它只与IE一起使用吗?我尝试了IE和FF,但是它没有用. (4认同)
  • ir=createElement('iframe'); -- iframe 是 iFrame ID。 (2认同)

Dan*_*son 8

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

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

MSDN在这里


Kev*_*vin 8

目前,可以使用File,FileWriterFileSystem API 从浏览器选项卡/窗口的上下文中编写和读取文件,尽管它们的使用有一些警告(参见本答案的尾部).

但要回答你的问题:

使用BakedGoods*

写文件:

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

阅读文件:

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

使用原始文件,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);
Run Code Online (Sandbox Code Playgroud)

阅读文件:

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);
Run Code Online (Sandbox Code Playgroud)

你问的对吗?也许,也许不是.后两个API:

  • 目前仅在基于Chromium的浏览器中实施(Chrome和Opera)
  • 已经脱离了W3C标准的轨道,并且截至目前是专有API
  • 可能会在将来从实现的浏览器中删除
  • 将文件的创建限制在磁盘上的沙箱(文件无法生效的位置)

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

因此,虽然您可以使用API​​将文件写入系统,但是在没有API的情况下定位文件(好吧,没有FileSystem API)可能是一件非常重要的事情.

如果您可以处理这些问题/限制,那么这些API几乎是您提出要求的唯一原生方式.

如果您对非原生解决方案持开放态度,Silverlight还允许通过IsolatedStorage从选项卡/窗口竞赛中获取文件i/o .但是,托管代码需要使用此功能; 需要编写此类代码的解决方案超出了本问题的范围.

当然,一个使用补充托管代码的解决方案,只留下一个只写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){}
});
Run Code Online (Sandbox Code Playgroud)

*BakedGoods是一个Javascript库,它建立了一个统一的接口,可用于在所有本机和一些非本机存储设施中执行常见的存储操作.它由这个人维持在这里:).


小智 7

对于Firefox:

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

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

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


gm2*_*008 5

在浏览器上下文中,Javascript 可以读取用户指定的文件。请参阅埃里克·比德曼 (Eric Bidelman) 的博客使用 File API 读取文件的详细信息,。但是,基于浏览器的 Javascript 无法在不禁用某些安全设置的情况下写入本地计算机的文件系统,因为任何网站都将任意更改本地文件系统视为安全威胁。

话虽如此,有一些方法可以解决它,具体取决于您要执行的操作:

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

  2. Chrome 支持文件系统,它是本地文件系统的沙盒部分。有关详细信息,请参阅此页面。这为您在本地临时保存东西提供了可能。但是,其他浏览器不支持此功能。

  3. 如果你不限于浏览器,Node.js 有一个完整的文件系统接口。请参阅此处了解其文件系统文档。请注意,Node.js 不仅可以在服务器上运行,还可以在任何客户端计算机上运行,​​包括 Windows。javascript 测试运行程序 Karma 基于 Node.js。如果您只想在本地计算机上使用 javascript 编程,这是一个选项。


Ron*_*der 5

为那些想要从 javascript 下载包含特定内容的文件的人编写此答案。我也在为同样的事情而苦苦挣扎。

const data = {name: 'Ronn', age: 27};              //sample json
const a = document.createElement('a');
const blob = new Blob([JSON.stringify(data)]);
a.href = URL.createObjectURL(blob);
a.download = 'sample-profile';                     //filename to download
a.click();
Run Code Online (Sandbox Code Playgroud)

在此处查看 Blob 文档 - Blob MDN