Как читать/записывать локальные файлы через веб-страницу?

Я пишу приложение на основе html и хочу хранить и извлекать данные из локального файла. Это приложение не будет размещено на веб-сервере.

Кто-нибудь может помочь рассказать о том, как это можно сделать?

Ответ 1

Вам следует использовать API-интерфейс FileSystem HTML5:

window.requestFileSystem(window.TEMPORARY, 5*1024*1024, function(){
    fs.root.getFile('test.dat', {}, function(fileEntry) {
        fileEntry.file(function(file) {
            // Here is our file object ... 
        });
    });
}, errorHandler);

Оформить заказ API файловой системы для получения дополнительной справки

Посетите Тест HTML5 для проверки поддержки браузера

Ответ 3

IF (и только если) вы - платформа, будет IE, вы можете использовать инфраструктуру HTA (HTML Applications):

http://msdn.microsoft.com/en-us/library/ms536471(VS.85).aspx

Приложениям, использующим это, предоставляются привилегии на системном уровне и могут использовать те же объекты, что и хост Windows Scripting (например, объект файловой системы для чтения и доступа к локальным файлам).

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

Ответ 4

Ответ на этот вопрос зависит от ваших ответов на следующие вопросы:

  • Вы в порядке с тем, что поддержка записи файлов в настоящее время существует только в браузерах на основе Chrome (Chrome и Opera)?
  • Вы в порядке с использованием API-интерфейсов as-of-now, чтобы воспользоваться такой возможностью?
  • Вы в порядке с возможностью удаления указанного API в будущем?
  • Вы в порядке с сужением файлов, созданных с указанным API, на песочницу (место, за пределами которого файлы не могут повлиять) на диске?
  • Вы в порядке с использованием виртуальной файловой системы (структура каталогов, которая не обязательно существует на диске в той же форме, что и при доступе из браузера) для представления таких файлов?

Если вы ответили "да" на все вышеперечисленное, затем File, FileWriter и FileSystem, вы можете записывать файлы из контекста вкладки/окна браузера с помощью Javascript.

Как вы спросили?

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);

Но что, если вы ответили "нет" на какие-либо вопросы в начале?

Если вы открыты для не-родных решений, 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 поддерживается не кем иным, как этим парнем прямо здесь:)