File System Access API - ローカルファイルの読み書き

ブラウザから直接ファイルを読み書き・保存するためのFile System Access APIサポートを検出。ファイルピッカー、ディレクトリアクセス、セキュリティモデルを解説。

Platform

詳細な説明

File System Access API検出

File System Access APIは、ファイルピッカーダイアログを通じてユーザーのローカルファイルシステム上のファイルを読み書きすることをWebアプリケーションに許可し、Webとデスクトップアプリケーションのギャップを埋めます。

検出

const hasFileSystemAccess = 'showOpenFilePicker' in window;
const hasSaveFilePicker = 'showSaveFilePicker' in window;
const hasDirectoryPicker = 'showDirectoryPicker' in window;

ファイルを開く

async function openFile() {
  const [handle] = await window.showOpenFilePicker({
    types: [{
      description: 'テキストファイル',
      accept: { 'text/plain': ['.txt', '.md'] },
    }],
    multiple: false,
  });
  const file = await handle.getFile();
  const text = await file.text();
  return { handle, text };
}

ファイルを保存

async function saveFile(handle, content) {
  if (!handle) {
    handle = await window.showSaveFilePicker({
      suggestedName: 'document.txt',
      types: [{
        description: 'テキストファイル',
        accept: { 'text/plain': ['.txt'] },
      }],
    });
  }
  const writable = await handle.createWritable();
  await writable.write(content);
  await writable.close();
  return handle;
}

ディレクトリアクセス

async function openDirectory() {
  const dirHandle = await window.showDirectoryPicker();
  for await (const entry of dirHandle.values()) {
    console.log(entry.kind, entry.name);
  }
}

セキュリティモデル

  • ユーザージェスチャー必須: すべてのピッカーメソッドに最近のユーザーインタラクションが必要
  • ファイルごとのパーミッション: ユーザーは個別のファイルまたはディレクトリへのアクセスを許可
  • 取り消し可能: パーミッションはいつでも取り消し可能
  • サイレントアクセスなし: ユーザーがピッカーを通じて明示的に選択しない限り、APIはファイルにアクセスできない

ブラウザサポート

現在Chromiumブラウザ(Chrome、Edge、Opera)で利用可能。FirefoxとSafariはファイルアクセスに異なるアプローチを使用しています。

ユースケース

ディスク上のファイルを直接読み書きする必要があるWebベースのコードエディタ(VS Code for the Webなど)、ドキュメントエディタ、画像エディタ、IDEを可能にします。ビルドツール、ファイルマネージャー、デスクトップアプリケーションを置き換えるアプリにも便利です。

試してみる — Browser Feature Detector

フルツールを開く