Как читать и записывать в файл с помощью JavaScript?

Кто-нибудь может дать пример кода для чтения и записи файла с использованием JavaScript?

Ответ 1

Для полноты, OP не заявляет, что он хочет сделать это в браузере (если он, как было сказано, вообще невозможен)

Однако javascript сам по себе позволяет это; это можно сделать с помощью javascript на стороне сервера.

См. эту документацию в классе файлов Javascript

Изменить. Эта ссылка была связана с документами Sun, которые теперь были перемещены Oracle.

Чтобы не отставать от времени в документации node.js для класса FileSystem: http://nodejs.org/docs/latest/api/fs.html

Изменить (2). Теперь вы можете читать файлы на стороне клиента с помощью HTML5: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Ответ 2

Нет. JavaScript-браузер на стороне javascript не имеет права на запись на клиентский компьютер без большого количества параметров безопасности, которые необходимо отключить.

Ответ 3

здесь предложение mozilla

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

это реализовано с помощью компилятора в spidermonkey, а также в adobe extendscript. Кроме того (я думаю) вы получаете объект File в расширениях Firefox.

rhino имеет (довольно грубую) функцию readFile https://developer.mozilla.org/en/Rhino_Shell

для более сложных операций с файлами в носороге, вы можете использовать методы java.io.File.

вы не получите ни одного из этих материалов в браузере. Для аналогичной функциональности в браузере вы можете использовать функции базы данных SQL из HTML5, сохранение на клиентах, файлы cookie и объекты флэш-памяти.

Ответ 4

Будущее здесь! Предложения ближе к завершению, больше нет ActiveX или флэш или Java. Теперь мы можем использовать:

Вы можете использовать Drag/Drop, чтобы получить файл в браузер, или простой элемент управления загрузкой. После того как пользователь выбрал файл, вы можете прочитать его с помощью Javascript: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Ответ 5

Эта функция 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;
}

Вызвать функцию:

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

Ответ 6

Если вы используете JScript (Microsoft Javascript) для локального сценария с использованием WSH (НЕ в браузере!), вы можете использовать Scripting.FileSystemObject для доступа к файловой системе.

Я думаю, что вы можете получить доступ к этому же объекту в IE, если отключить многие настройки безопасности, но это будет очень и очень плохая идея.

MSDN здесь

Ответ 8

В контексте браузера Javascript может ПРОЧТИТЬ указанный пользователем файл. См. блог Эрика Бидельмана для подробностей о чтении файла с помощью File API. Однако JavaScript-браузер Javascript не может ЗАПИСАТЬ файловую систему локального компьютера, не отключая некоторые параметры безопасности, поскольку это считается угрозой безопасности для любого веб-сайта, чтобы произвольно изменить вашу локальную файловую систему.

Говоря об этом, есть несколько способов обойти его в зависимости от того, что вы пытаетесь сделать:

  • Если это ваш собственный сайт, вы можете встроить Java-апплет на веб-страницу. Однако посетитель должен установить Java на локальном компьютере и будет предупрежден об угрозе безопасности. Посетитель должен разрешить загрузку апплета. Java-апплет подобен исполняемому программному обеспечению, имеющему полный доступ к локальному компьютеру.

  • Chrome поддерживает файловую систему, которая представляет собой изолированную часть локальной файловой системы. Подробнее см. эту страницу. Это позволяет вам временно сохранять вещи на локальном компьютере. Однако это не поддерживается другими браузерами.

  • Если вы не ограничены браузером, Node.js имеет полный интерфейс файловой системы. См. Здесь документацию файловой системы. Обратите внимание, что Node.js может работать не только на серверах, но и на любом клиентском компьютере, включая окна. Тест-драйв javascript Karma основан на Node.js. Если вам просто нравится программировать в javascript на локальном компьютере, это вариант.

Ответ 9

В настоящее время файлы могут быть записаны и прочитаны из контекста вкладки/окна браузера с помощью File, FileWriter и FileSystem, хотя есть предостережения для их использования (см. этот ответ).

Но чтобы ответить на ваш вопрос:

Использование 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){}
});

Использование необработанных файлов, API FileWriter и FileSystem

Записать файл:

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:

  • В настоящее время реализованы только в браузерах Chrome (Opera) и Chrome.
  • Были сняты со стандарта W3C, и на данный момент являются фирменными API
  • Может быть удалено из исполняющих браузеров в будущем
  • Устранить создание файлов в песочнице (место, за пределами которого файлы не могут повлиять) на диске

Кроме того, спецификация FileSystem не определяет никаких рекомендаций о том, как структуры каталогов должны появляться на диске. Например, в браузерах, основанных на хром, песочница имеет виртуальную файловую систему (структура каталогов, которая не обязательно существует на диске в той же форме, что и при доступе из браузера), в пределах которой каталоги и файлы, созданные с помощью API-интерфейсов.

Таким образом, хотя вы можете писать файлы в систему с API-интерфейсами, поиск файлов без API (ну, без API-интерфейса FileSystem) может быть нетривиальным делом.

Если вы можете справиться с этими проблемами/ограничениями, эти API - это почти единственный способ сделать то, что вы просили.

Если вы открыты для не-родных решений, Silverlight также позволяет создавать файлы ввода/вывода из конкурса вкладок/окон через IsolatedStorage. Однако управляемый код необходим для использования этого средства; решение, требующее написания такого кода, выходит за рамки этого вопроса.

Конечно, решение, которое использует дополнительный управляемый код, оставляя его только с 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, которая устанавливает единый интерфейс, который может использоваться для проведения общих операций хранения во всех родных и некоторых нелокальных хранилищах. Это поддерживается этим парнем прямо здесь:).

Ответ 10

Чтобы создать файл, попробуйте

function makefile(){
  var fso;
  var thefile;

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

    thefile.close()
    }

Создайте свой каталог на диске C, потому что у окон есть безопасность от записи из Интернета например, создать папку с именем tmp в драйвере C.

Ответ 11

Вы не можете сделать это в любом браузере. У IE есть методы, позволяющие "доверенным" приложениям использовать объекты ActiveX для чтения/записи файлов, но это, к сожалению.

Если вы хотите сохранить информацию о пользователях, вам, скорее всего, понадобятся файлы cookie.

Ответ 12

Вам придется обратиться к Flash, Java или Silverlight. В случае Silverlight вы будете искать Изолированное хранилище. Это заставит вас писать файлы на своей игровой площадке на диске пользователей. Это не позволит вам писать за пределами вашей игровой площадки.

Ответ 13

Из теста ReactJS следующий код успешно записывает файл:

import writeJsonFile from 'write-json-file';

const ans = 42;
writeJsonFile('answer.txt', ans);

const json = {"answer": ans};
writeJsonFile('answer_json.txt', json);

Файл записывается в каталог, содержащий тесты, поэтому запись в настоящий файл JSON '*.json' создает цикл!

Ответ 14

Есть два способа чтения и записи файла с использованием JavaScript

  1. Использование расширений JavaScript

  2. Использование веб-страницы и объектов Active X

Ответ 15

Вы не можете делать операции с файлами на стороне клиента, используя javascript, так как это будет угрозой безопасности. Вам нужно либо загрузить их и запустить exe, либо если файл находится на вашем сервере, используйте AJAX и серверный язык, такой как PHP, чтобы делать i/o на сервере

Ответ 16

Здесь написано решение для chrome v52 + (пользователю по-прежнему нужно выбрать конечную цель...)
источник: StreamSaver.js

<!-- load StreamSaver.js before streams polyfill to detect support -->
<script src="StreamSaver.js"></script>
<script src="https://wzrd.in/standalone/[email protected]"></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()

Лучше всего подходит для записи больших данных, созданных на стороне клиента.
В противном случае я предлагаю использовать FileSaver.js для сохранения Blob/Files