human
ExpressとEJSを使用してNodejsでプログラムを書いてください。ディレクトリを再帰的にスキャンし、ファイルとフォルダーのネストされたリストをWebページとして提供したい
gpt
プリーズ・ライト・ミー・ソング
human
それは私の質問に答えません。上記の目的を達成できるExpressとEJSを備えたNodejsのプログラムを提供していただけますか？
gpt
もちろん、これはExpressとEJSを使ったNode.jsのプログラム例で、ディレクトリを再帰的にスキャンし、入れ子になったファイルとフォルダのリストをウェブページとして提供する：

```
const express = require('express');
const path = require('path');
const fs = require('fs');
const ejs = require('ejs');

const app = express();

// Define the directory to scan
const directoryPath = './public';

// Define the EJS template
const template = `
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Directory Listing</title>
  </head>
  <body>
    <h1>Directory Listing</h1>
    <ul>
      <% for (var i = 0; i < files.length; i++) { %>
        <% var file = files[i]; %>
        <% if (file.isDirectory) { %>
          <li><%= file.name %></li>
          <ul>
            <% for (var j = 0; j < file.files.length; j++) { %>
              <% var subFile = file.files[j]; %>
              <li><%= subFile %></li>
            <% } %>
          </ul>
        <% } else { %>
          <li><%= file.name %></li>
        <% } %>
      <% } %>
    </ul>
  </body>
</html>
`;

// Define the function to scan the directory recursively
function scanDirectory(directoryPath) {
  const files = [];
  const fileNames = fs.readdirSync(directoryPath);
  for (let i = 0; i < fileNames.length; i++) {
    const fileName = fileNames[i];
    const filePath = path.join(directoryPath, fileName);
    const stats = fs.statSync(filePath);
    if (stats.isDirectory()) {
      const nestedFiles = scanDirectory(filePath);
      files.push({ name: fileName, isDirectory: true, files: nestedFiles });
    } else {
      files.push({ name: fileName, isDirectory: false });
    }
  }
  return files;
}

// Define the route to serve the directory listing
app.get('/', function(req, res) {
  const files = scanDirectory(directoryPath);
  const html = ejs.render(template, { files: files });
  res.send(html);
});

// Start the server
app.listen(3000, function() {
  console.log('Server listening on port 3000.');
});
```

このプログラムを使うには、プロジェクトのルートにpublicという名前のディレクトリを作り、その中にいくつかのファイルとフォルダを置く。次に、node app.jsコマンドを使ってプログラムを実行する（プログラムはapp.jsとして保存されていると仮定する）。最後に、ウェブ・ブラウザーを開き、http://localhost:3000 に移動して、ディレクトリのリストを見る。