klren0312 / daliy_knowledge

知识积累,正确使用方式是watch
22 stars 4 forks source link

js文件夹操作demo #763

Open klren0312 opened 9 months ago

klren0312 commented 9 months ago
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .flex {
      display: flex;
    }
    .flex div {
      flex: 1;
    }
  </style>
</head>
<body>
  <div class="flex">
    <div>
      <button id="js-opendir">选择文件夹</button>
      <ul id="js-dir"></ul>
    </div>
    <div class="flex">
      <button id="js-savebtn">保存文件</button>
      <textarea id="js-textarea" cols="50" rows="50"></textarea>
    </div>
  </div>
  <script>
    document.getElementById('js-opendir').addEventListener('click', open, true)
    document.getElementById('js-savebtn').addEventListener('click', saveFile, true)
    let dirHandle = null
    let editFileHandle = null
    // 选择路径
    async function open () {
      dirHandle = await window.showDirectoryPicker();
      const fragment = await getFileInDir(dirHandle.values())
      document.getElementById('js-dir').appendChild(fragment)
    }

    // 目录/文件点击事件
    async function openFile(e) {
      console.log(e.target.dataset.type)
      const type = e.target.dataset.type
      const name = e.target.dataset.name
      if (type === 'directory') {
        // 点击目录 列出目录下文件
        const currentDirHandle = await dirHandle.getDirectoryHandle(name, {
          create: true,
        })
        const frag = await getFileInDir(currentDirHandle.values())
        const childUl = document.createElement('ul')
        childUl.appendChild(frag)
        e.target.appendChild(childUl)
      } else if (type === 'file') {
        // 点击文件 读取文件
        const currentFileHandle = await dirHandle.getFileHandle(name, { create: true })
        const currentFile = await currentFileHandle.getFile()
        console.log(currentFile)
        const content = await getFileContent(currentFile)
        document.getElementById('js-textarea').value = content
        editFileHandle = currentFileHandle
      }
    }
    // 保存文件内容
    async function saveFile () {
      const writable = await editFileHandle.createWritable()
      // 将文件内容写入到流中。
      const content = document.getElementById('js-textarea').value
      await writable.write(content)

      // 关闭文件并将内容写入磁盘。
      await writable.close()
    }
    // 获取目录下文件
    async function getFileInDir (values) {
      const fragment = new DocumentFragment()
      for await (const item of values) {
        const li = document.createElement('li')
        li.setAttribute('data-type', item.kind)
        li.setAttribute('data-name', item.name)
        li.innerText = item.kind + ': ' + item.name
        li.addEventListener('click', openFile, true)
        fragment.append(li)
      }
      return fragment
    }

    // 获取文件内容
    function getFileContent(file) {
      return new Promise(resolve => {
        const reader = new FileReader()
        reader.onload = (evt) => {
          resolve(evt.target.result)
        }
        reader.readAsText(file)
      })
    }
  </script>
</body>
</html>