locked
[Разработка на js] Запись текста в файл RRS feed

  • Вопрос

  • В алгоритме сохранения файла

    savePicker.pickSaveFileAsync().then(function (file) {

    if (file) { Windows.Storage.CachedFileManager.deferUpdates(file); Windows.Storage.FileIO.writeTextAsync(file, content); } else { } });

    Нельзя писать несколько раз Windows.Storage.FileIO.writeTextAsync, они перезаписывают друг друга. А мне в файл нужно записать кучу текста. Что делать? В переменную content писать дофигища текста? Но тогда как?

    Прошарил вопросы тут на форуме, ничего дееспособного и подходящего не нашёл.


    ©KW

    28 июня 2014 г. 5:29

Ответы

  • AppendTextAsync работает неправильно: то запишет всего две строки, то 800 дублированных строк. В чём дело?


    Потому что Async. Начинает асинхронно работать один метод, не успевает завершиться до конца, как его прерывает другой асинхронный метод, тоже пишет данные, его прерывает третий и так далее.

    Нужно дожидаться завершение одного асинхронного вызова и лишь затем вызывать другой. Можно каждый вызов AppendTextAsync писать в конструкции .then.

    28 июня 2014 г. 12:46

Все ответы

  • WriteTextAsync перезаписывает содержимое файла. Чтобы добавить текст, используйте AppendTextAsync.
    28 июня 2014 г. 11:20
  • AppendTextAsync работает неправильно: то запишет всего две строки, то 800 дублированных строк. В чём дело? Кодировка по дефолту UTF-8.

    Вместо этого приходится юзать полукостыли:

    /*
    * ЭТО РАБОТАЕТ
    */
    Windows.Storage.FileIO.writeTextAsync(file, testPrefix + "begin" + "\n"
                    + _test.testConst.Info.name + "=" + _test.testInfo.name + "\n"
                    + _test.testConst.Info.author + "=" + _test.testInfo.author + "\n"
                    + _test.testConst.Info.link + "=" + _test.testInfo.link + "\n"
                    + _test.testConst.Info.mail + "=" + _test.testInfo.mail + "\n"
                    + _test.testConst.Info.org + "=" + _test.testInfo.org + "\n"
                    + _test.testConst.Info.orgType + "=" + _test.testInfo.orgType + "\n"
                    + _test.testConst.Info.course + "=" + _test.testInfo.level + "\n"
                    + arrQ.join("\n"));
    /*
    * А ЭТО НЕ РАБОТАЕТ
    */
    Windows.Storage.FileIO.appendTextAsync(file, testPrefix + "begin" + "\n");
                    Windows.Storage.FileIO.appendTextAsync(file, _test.testConst.Info.name + "=" + _test.testInfo.name + "\n");
                    Windows.Storage.FileIO.appendTextAsync(file, _test.testConst.Info.author + "=" + _test.testInfo.author + "\n");
                    Windows.Storage.FileIO.appendTextAsync(file, _test.testConst.Info.link + "=" + _test.testInfo.link + "\n");
                    Windows.Storage.FileIO.appendTextAsync(file, _test.testConst.Info.mail + "=" + _test.testInfo.mail + "\n");
                    Windows.Storage.FileIO.appendTextAsync(file, _test.testConst.Info.org + "=" + _test.testInfo.org + "\n");
                    Windows.Storage.FileIO.appendTextAsync(file, _test.testConst.Info.orgType + "=" + _test.testInfo.orgType + "\n");
                    Windows.Storage.FileIO.appendTextAsync(file, _test.testConst.Info.course + "=" + _test.testInfo.level + "\n");
    
                    for (i = 0; i < _test.q.name.length; i++) {
                        Windows.Storage.FileIO.appendTextAsync(file, testPrefix + "beginQ" + "\n");
                        Windows.Storage.FileIO.appendTextAsync(file, _test.testConst.Q.name + "=" + _test.q.name[i] + "\n");
                        Windows.Storage.FileIO.appendTextAsync(file, _test.testConst.Q.varQType + "=" + _test.q.varType[i] + "\n");
                        for (j = 0; j < _test.q.varQ[i].length; j++) {
                            Windows.Storage.FileIO.appendTextAsync(file, _test.testConst.Q.varQ + "=" + _test.q.varQ[i][j] + "\n");
                        }
                        Windows.Storage.FileIO.appendTextAsync(file, testPrefix + "endQ" + "\n");
                    });


    ©KW




    • Изменено Kenya-West 28 июня 2014 г. 12:35
    28 июня 2014 г. 12:33
  • AppendTextAsync работает неправильно: то запишет всего две строки, то 800 дублированных строк. В чём дело?


    Потому что Async. Начинает асинхронно работать один метод, не успевает завершиться до конца, как его прерывает другой асинхронный метод, тоже пишет данные, его прерывает третий и так далее.

    Нужно дожидаться завершение одного асинхронного вызова и лишь затем вызывать другой. Можно каждый вызов AppendTextAsync писать в конструкции .then.

    28 июня 2014 г. 12:46
  • AppendTextAsync работает неправильно: то запишет всего две строки, то 800 дублированных строк. В чём дело?


    Потому что Async. Начинает асинхронно работать один метод, не успевает завершиться до конца, как его прерывает другой асинхронный метод, тоже пишет данные, его прерывает третий и так далее.

    Нужно дожидаться завершение одного асинхронного вызова и лишь затем вызывать другой. Можно каждый вызов AppendTextAsync писать в конструкции .then.

    Опа, вот оно что, наконец-то я стал вникать. Пожалуйста, ответьте - придётся писать вложенные .then() и .done() и каждый раз влаживать друг в друга, да?

    ©KW

    28 июня 2014 г. 12:48
  • Пожалуйста, ответьте - придётся писать вложенные .then() и .done() и каждый раз влаживать друг в друга, да?

    Скорей всего - да. Я сам не специалист в разработке на js, поэтому может кто другой уточнит лучше.

    Но эта асинхронность реально иногда вывихивает мозги. Особенно тем, кто привык к старым добрым способам...

    28 июня 2014 г. 12:51