#javascript #file-system-access-api
Вопрос:
Я следил за этой статьей, чтобы позволить пользователям (полу) автоматически сохранять XML-файл, созданный на стороне клиента, в определенную локальную папку. Сторонняя программа просматривает эту папку и обрабатывает ее содержимое и выводит содержимое в другой файл.
Проблема в том, что с момента создания файла требуется около 250 мс, пока содержимое не будет фактически записано в файл с использованием метода close() .
Иногда сторонняя программа обнаруживает, что файл был создан, и пытается прочитать его содержимое до его записи. Программа не поддерживает добавление задержки перед попыткой прочитать содержимое файла.
Я изучил возможность записи файла во временное местоположение и перемещения его после его закрытия, но, похоже, это невозможно с помощью этого API. То же самое касается переименования файла.
Создание / загрузка файла с помощью обычного диалогового окна, вероятно, сработает, но для этого требуются ручные действия, которых можно избежать с помощью API доступа к файловой системе.
Другим решением было бы установить локальную программу, которая может перемещать файл из временной папки в папку просмотра программы, когда она закрыта, но я бы предпочел избежать установки программного обеспечения на клиенте.
Есть ли другой способ избежать этой проблемы?
Спасибо
Комментарии:
1. Если вы говорите о временном файле .crswap. Есть несколько обходных путей, упомянутых в crbug.com/1168715 но работать с ними довольно утомительно.
2. Файл .crswap в порядке. Проблема в основном заключается в том, что пустой файл изначально создается getFileHandler(filename, {create: true}), и только через ~ 250 мс фактическое содержимое записывается в file (где содержимое из временного файла .crswap копируется в пустой файл, созданный ранее). Проблема была бы решена, если бы я мог подождать с созданием файла до его закрытия.
3. Похоже, над функциональностью перемещения активно работают прямо сейчас. Это доступно в Canary с
chrome://flags/#enable-experimental-web-platform-features
флагом.4. Спасибо! только что попробовал, и теперь работает как перемещение, так и переименование.
Ответ №1:
Теперь есть способ переименования и перемещения файлов (в настоящее время реализован в Chrome 96 за флагом experimental web platform features):
// Get references to a file and a directory.
const [file] = await showOpenFilePicker();
const directory = await showDirectoryPicker();
// Rename the file.
await file.rename('new_name');
// Move the file to a new directory.
await file.move(directory);
// Move the file to a new directory and rename it.
await file.move(directory, 'newer_name');
Вы можете следить за работой спецификации, подписавшись на этот PR.
Комментарии:
1. Я пытался создать и переместить файл, используя последнюю версию (не канарейку) Chrome (v96.0.4664.45) и включенные экспериментальные функции, однако я получаю «Исключение DOMException: пользователь прервал запрос» всякий раз, когда я пытаюсь переместить файл. Все работает должным образом, если я не буду выполнять перемещение. Тот же код отлично работает в canary.
2. Да, это ожидаемо, поскольку эта функция была полностью реализована только в 98 году. Это было лишь частично реализовано в более ранних версиях (именно поэтому оно скрыто за флагом).