As APIs File System Access e Origin Private File System permitem que os desenvolvedores acessem arquivos e diretórios no dispositivo do usuário. O primeiro permite que os desenvolvedores leiam e gravem no sistema de arquivos normal visível ao usuário, e o segundo abre um sistema de arquivos especial, oculto do sistema de arquivos do usuário, particular à origem de cada site e que oferece algumas vantagens de desempenho. Os desenvolvedores interagem com arquivos e diretórios em ambos os casos usando objetos FileSystemHandle
, de maneira mais concreta, FileSystemFileHandle
para arquivos e FileSystemDirectoryHandle
para diretórios. Até agora, ser informado sobre mudanças em um arquivo ou diretório em qualquer um dos sistemas de arquivos exigia alguma forma de pesquisa e comparação do carimbo de data/hora lastModified
ou até mesmo do conteúdo do arquivo.
A API File System Observer, em teste de origem do Chrome 129, muda isso e permite que os desenvolvedores sejam alertados automaticamente quando ocorrem mudanças. Este guia explica como ele funciona e como testar o recurso.
Casos de uso
Use a API File System Observer em apps que precisam ser informados sobre possíveis mudanças no sistema de arquivos assim que elas acontecerem.
- Ambientes de desenvolvimento integrados (IDEs) baseados na Web que mostram uma representação da árvore do sistema de arquivos de um projeto.
- Apps que sincronizam mudanças no sistema de arquivos com um servidor. Por exemplo, um arquivo de banco de dados SQLite.
- Apps que precisam notificar a linha de execução principal sobre mudanças no sistema de arquivos de um worker ou outra guia.
- Apps que observam um diretório de recursos, por exemplo, para otimizar imagens automaticamente.
Como usar a API File System Observer
Detecção de recursos
Para conferir se há suporte para a API File System Observer, execute um teste de recurso como no exemplo a seguir.
if ('FileSystemObserver' in self) {
// The File System Observer API is supported.
}
Inicializar um observador do sistema de arquivos
Inicialize um observador do sistema de arquivos chamando new FileSystemObserver()
e fornecendo a ele uma função callback
como argumento.
const observer = new FileSystemObserver(callback);
Começar a observar um arquivo ou diretório
Para começar a observar um arquivo ou diretório, chame o método assíncrono observe()
da instância FileSystemObserver
. Forneça a este método o FileSystemHandle
do arquivo ou diretório selecionado como um argumento. Ao observar um diretório, há um argumento options
opcional que permite escolher se você quer receber informações sobre mudanças no diretório de forma recorrente (ou seja, para o próprio diretório e todos os subdiretórios e arquivos contidos). A opção padrão é observar apenas o próprio diretório e os arquivos diretamente contidos.
// Observe a file.
await observer.observe(fileHandle);
// Observe a directory.
await observer.observe(directoryHandle);
// Observe a directory recursively.
await observer.observe(directoryHandle, {recursive: true});
A função de callback
Quando ocorrem mudanças no sistema de arquivos, uma função de callback é chamada com a mudança do sistema de arquivos records
e o próprio observer
como argumentos. Você pode usar o argumento observer
para, por exemplo, desconectar o observador (consulte Parar de observar o sistema de arquivos) quando todos os arquivos em que você tem interesse forem excluídos.
const callback = (records, observer) => {
for (const record of records) {
console.log('Change detected', record);
}
};
O registro de alteração do sistema de arquivos
Cada registro de alteração do sistema de arquivos tem a estrutura a seguir. Todos os campos são somente leitura.
root
(umFileSystemHandle
): o handle transmitido à funçãoFileSystemObserver.observe()
.changedHandle
(umFileSystemHandle
): o identificador afetado pela mudança no sistema de arquivos.relativePathComponents
(umArray
): o caminho dochangedHandle
em relação aoroot
.type
(umaString
): o tipo de alteração. Os seguintes tipos são possíveis:"appeared"
: o arquivo ou diretório foi criado ou movido pararoot
."disappeared"
: o arquivo ou diretório foi excluído ou movido doroot
."modified"
: o arquivo ou diretório foi modificado."moved"
: o arquivo ou diretório foi movido dentro deroot
."unknown"
: indica que zero ou mais eventos foram perdidos. Os desenvolvedores devem pesquisar o diretório monitorado em resposta a isso."errored"
: a observação não é mais válida. Nesse caso, pare de observar o sistema de arquivos.
relativePathMovedFrom
(umArray
, opcional): o antigo local de um identificador movido. Disponível apenas quando otype
é"moved"
.
Parar de observar um arquivo ou diretório
Para parar de observar um FileSystemHandle
, chame o método unobserve()
, transmitindo o handle como um argumento.
observer.unobserve(fileHandle);
Parar de observar o sistema de arquivos
Para parar de observar o sistema de arquivos, desconecte a instância FileSystemObserver
da seguinte maneira.
observer.disconnect();
Teste a API
Para testar a API File System Observer localmente, defina a flag #file-system-observer
em about:flags
. Para testar a API com usuários reais, inscreva-se no teste de origem e siga as instruções do guia Testes de origem do Chrome. O teste de origem vai acontecer do Chrome 129 (11 de setembro de 2024) ao Chrome 134 (26 de fevereiro de 2025).
Demonstração
Confira a API File System Observer em ação na demonstração incorporada. Confira o código-fonte ou remixe o código de demonstração no Glitch. A demonstração cria, exclui ou modifica arquivos aleatoriamente em um diretório observado e registra a atividade na parte superior da janela do app. Em seguida, ele registra as mudanças à medida que elas ocorrem na parte de baixo da janela do app. Se isso acontecer em um navegador sem suporte à API File System Observer, confira uma captura de tela da demonstração.
Feedback
Se você tiver feedback sobre o formato da API File System Observer, comente sobre o problema 123 no repositório WhatWG/fs.
Links relevantes
- Explicação
- Avaliação da TAG
- Posição de padrões da Mozilla
- Posição dos padrões do WebKit
- ChromeStatus
- Bug do Chromium
Agradecimentos
Este documento foi revisado por Daseul Lee, Nathan Memmott, Etienne Noël e Rachel Andrew.