Переименование / перемещение файлов с использованием API доступа к файловой системе (javascript)

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