如何使用JavaScript读写文件?

如何使用JavaScript读写文件?,javascript,file-io,Javascript,File Io,有人能给出一些使用JavaScript读写文件的示例代码吗?没有。浏览器端JavaScript没有权限在没有禁用许多安全选项的情况下写入客户端计算机您不能以任何跨浏览器的方式执行此操作。IE确实有一些方法可以让“受信任”的应用程序使用ActiveX对象来读/写文件,但不幸的是,就是这样 如果您希望保存用户信息,则很可能需要使用cookies。您不能在客户端使用javascript进行文件i/o,因为这会带来安全风险。您必须让他们下载并运行exe,或者如果文件在您的服务器上,则使用AJAX和服务器

有人能给出一些使用JavaScript读写文件的示例代码吗?

没有。浏览器端JavaScript没有权限在没有禁用许多安全选项的情况下写入客户端计算机

您不能以任何跨浏览器的方式执行此操作。IE确实有一些方法可以让“受信任”的应用程序使用ActiveX对象来读/写文件,但不幸的是,就是这样


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

您不能在客户端使用javascript进行文件i/o,因为这会带来安全风险。您必须让他们下载并运行exe,或者如果文件在您的服务器上,则使用AJAX和服务器端语言(如PHP)在服务器端执行i/o操作,如果您使用JScript(Microsoft的Javascript)使用WSH(而不是在浏览器中!)您可以使用
Scripting.FileSystemObject
访问文件系统

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


这是mozilla的提案

这是通过spidermonkey中的编译开关以及adobe的extendscript实现的。另外(我认为)您可以在firefox扩展中获得文件对象

rhino有一个(相当简单的)readFile函数

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


不过,你不会在浏览器中看到这些内容。对于浏览器中的类似功能,您可以使用HTML5、客户端持久化、cookie和flash存储对象中的SQL数据库功能。

您必须使用flash、Java或Silverlight。对于Silverlight,您将看到。这会让你在自己的操场上的用户磁盘上写入文件。不过,它不会让你在操场外写作。

为了完整起见,OP没有说明他希望在浏览器中这样做(如前所述,如果他希望这样做,通常是不可能的)

然而javascript本身允许这样做;这可以通过服务器端javascript完成

看到这个了吗

编辑:该链接指向现在已由Oracle移动的Sun文档

为了跟上时代的步伐,这里是文件系统类的node.js文档:

编辑(2):您现在可以使用HTML5在客户端读取文件:

创建文件,然后重试

function makefile(){
  var fso;
  var thefile;

    fso = new ActiveXObject("Scripting.FileSystemObject");
    thefile=fso.CreateTextFile("C:\\tmp\\MyFile.txt",true);

    thefile.close()
    }
在C驱动器中创建目录,因为windows具有防止从web写入的安全性
e、 在C驱动器中创建名为“tmp”的文件夹。

未来就在这里!这些提议已经接近完成,不再使用ActiveX、flash或java。现在我们可以使用:


您可以使用拖放将文件放入浏览器,或者使用简单的上载控件。一旦用户选择了一个文件,您就可以使用Javascript阅读它:

此Javascript函数向通过浏览器运行该文件的用户显示一个完整的“另存为”对话框。用户按下OK键,文件即被保存。

编辑:以下代码仅适用于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;
}
对于Firefox:

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


对于其他人,请查看应用程序以了解它是如何工作的。

在浏览器上下文中,Javascript可以读取用户指定的文件。有关使用文件API读取文件的详细信息,请参阅。 但是,基于浏览器的Javascript不可能在不禁用某些安全设置的情况下编写本地计算机的文件系统,因为任意更改本地文件系统会被视为安全威胁

也就是说,有一些方法可以解决这一问题,具体取决于您正在尝试做什么:

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

  • Chrome支持的文件系统是本地文件系统的沙盒部分。有关详细信息,请参阅。这可能为您提供在本地临时保存内容的功能。但是,其他浏览器不支持这一点

  • 如果您不局限于浏览器,Node.js具有完整的文件系统界面。请参见此处了解其详细信息。请注意,Node.js不仅可以在服务器上运行,还可以在包括windows在内的任何客户端计算机上运行。javascript测试运行程序Karma基于Node.js。如果您只想在本地计算机上使用javascript编程,这是一个选项


  • 以下是chrome v52+的写入解决方案(用户仍然需要选择目标doe…
    资料来源:

    
    
    const writeStream=streamSaver.createWriteStream('filename.txt'))
    const编码器=新的文本编码器
    让数据='a'。重复(1024)
    让uint8array=encoder.encode(数据+“\n\n”)
    writeStream.write(uint8array)//必须是uint8array
    writeStream.close()
    

    最适合写入客户端生成的大型数据。
    否则,我建议使用来保存Blob/文件。目前,可以使用、和API在浏览器选项卡/窗口的上下文中写入和读取文件,但使用时有一些注意事项(见本答案的结尾)

    但要回答你的问题:

    使用*

    写入文件:

    bakedGoods.set({
        data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
        storageTypes: ["fileSystem"],
        options: {fileSystem:{storageType: Window.PERSISTENT}},
        complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
    });
    
    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);
    
    读取文件:

    bakedGoods.get({
            data: ["testFile"],
            storageTypes: ["fileSystem"],
            options: {fileSystem:{storageType: Window.PERSISTENT}},
            complete: function(resultDataObj, byStorageTypeErrorObj){}
    });
    
    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);
    
    使用原始文件、FileWriter和文件系统API

    写入文件:

    bakedGoods.set({
        data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
        storageTypes: ["fileSystem"],
        options: {fileSystem:{storageType: Window.PERSISTENT}},
        complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
    });
    
    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);
    
    读取文件:

    bakedGoods.get({
            data: ["testFile"],
            storageTypes: ["fileSystem"],
            options: {fileSystem:{storageType: Window.PERSISTENT}},
            complete: function(resultDataObj, byStorageTypeErrorObj){}
    });
    
    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:

    • 目前仅在基于Chrome的浏览器(Chrome和Opera)中实现
    • 已经脱离了W3C标准的轨道,并且到目前为止是专有的API
    • 可以从执行b中删除