Sure! Here is an example program in Node.js using Express and EJS that recursively scans a directory and serves a nested list of files and folders as a webpage:

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

// Set the views directory and the view engine
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// Define the route for the directory listing
app.get('/list/:dir(*)', (req, res) => {
  // Get the directory path from the URL parameter
  const dirPath = path.join(__dirname, req.params.dir);

  // Check if the directory exists
  if (fs.existsSync(dirPath)) {
    // Read the contents of the directory
    const files = fs.readdirSync(dirPath);

    // Create an array to hold the nested list data
    const listData = [];

    // Iterate over each file/folder in the directory
    files.forEach(file => {
      // Construct the full path to the file/folder
      const filePath = path.join(dirPath, file);

      // Check if the item is a directory
      if (fs.statSync(filePath).isDirectory()) {
        // Recursively call this function to get the nested list of the subdirectory
        const nestedList = getNestedList(filePath);

        // Add the nested list data to the current item
        listData.push({ name: file, type: 'directory', items: nestedList });
      } else {
        // Add the file data to the current item
        listData.push({ name: file, type: 'file' });
      }
    });

    // Render the EJS template with the nested list data
    res.render('list', { dirPath, listData });
  } else {
    // If the directory does not exist, return a 404 error
    res.status(404).send('Directory not found');
  }
});

// Define the function to recursively get the nested list of a directory
function getNestedList(dirPath) {
  // Read the contents of the directory
  const files = fs.readdirSync(dirPath);

  // Create an array to hold the nested list data
  const nestedList = [];

  // Iterate over each file/folder in the directory
  files.forEach(file => {
    // Construct the full path to the file/folder
    const filePath = path.join(dirPath, file);

    // Check if the item is a directory
    if (fs.statSync(filePath).isDirectory()) {
      // Recursively call this function to get the nested list of the subdirectory
      const subList = getNestedList(filePath);

      // Add the nested list data to the current item
      nestedList.push({ name: file, type: 'directory', items: subList });
    } else {
      // Add the file data to the current item
      nestedList.push({ name: file, type: 'file' });
    }
  });

  // Return the nested list data
  return nestedList;
}

// Start the server on port 3000
app.listen(3000, () => console.log('Server started on port 3000'));
```

This program defines a route `/list/:dir(*)` that takes a directory path as a parameter and returns a webpage with a nested list of files and folders in that directory. The `getNestedList()` function is used to recursively scan the directory and construct the nested list data. The EJS template `views/list.ejs` is used to render the webpage with the nested list data.

Note: This program assumes that the directory being scanned is a local directory on the server running the Node.js application. If you want to scan a directory on a remote server or from a client-side web application, you will need to modify the program accordingly.
แน่นอน! นี่คือตัวอย่างโปรแกรมใน Node.js ที่ใช้ Express และ EJS ซึ่งจะสแกนไดเร็กทอรีแบบวนซ้ำและให้บริการรายการไฟล์และโฟลเดอร์ที่ซ้อนกันเป็นเว็บเพจ: ``` const express = need('express'); แอป const = ด่วน (); const ejs = ต้องการ('ejs'); เส้นทาง const = ต้องการ ('เส้นทาง'); const fs = ต้องการ('fs'); // ตั้งค่าไดเร็กทอรี views และ view engine app.set('views', path.join(__dirname, 'views')); app.set('ดูเอ็นจิ้น', 'ejs'); // กำหนดเส้นทางสำหรับรายการไดเรกทอรี app.get('/list/:dir(*)', (req, res) => { // รับเส้นทางไดเรกทอรีจากพารามิเตอร์ URL const dirPath = path.join(__dirname , req.params.dir); // ตรวจสอบว่ามีไดเร็กทอรีอยู่หรือไม่ถ้า (fs.existsSync(dirPath)) { // อ่านเนื้อหาของไดเร็กทอรี const files = fs.readdirSync(dirPath); // สร้างอาร์เรย์ที่จะเก็บ ข้อมูลรายการที่ซ้อนกัน const listData = []; // วนซ้ำแต่ละไฟล์/โฟลเดอร์ในไดเร็กทอรี files.forEach(file => { // สร้างพาธแบบเต็มไปยังไฟล์/โฟลเดอร์ const filePath = path.join(dirPath, file ); // ตรวจสอบว่ารายการนั้นเป็นไดเร็กทอรีหรือไม่ถ้า (fs.statSync(filePath).isDirectory()) { // เรียกฟังก์ชันนี้ซ้ำ ๆ เพื่อรับรายการซ้อนของไดเร็กทอรีย่อย const NestedList = getNestedList(filePath); // เพิ่ม ข้อมูลรายการที่ซ้อนกันไปยังรายการปัจจุบัน listData.push({ name: file, type: 'directory', items: NestedList }); } else { // เพิ่มข้อมูลไฟล์ลงในรายการปัจจุบัน listData.push({ name: file , type: 'file' }); } }); // เรนเดอร์เทมเพลต EJS ด้วยข้อมูลรายการที่ซ้อนกัน res.render('list', { dirPath, listData }); } else { // หากไม่มีไดเร็กทอรี ให้ส่งคืนข้อผิดพลาด 404 res.status(404).send('Directory not found'); } }); // กำหนดฟังก์ชันเพื่อรับรายการซ้อนของฟังก์ชันไดเร็กทอรี getNestedList(dirPath) { // อ่านเนื้อหาของไดเร็กทอรี const files = fs.readdirSync(dirPath); // สร้างอาร์เรย์เพื่อเก็บข้อมูลรายการซ้อน const NestedList = []; // วนซ้ำแต่ละไฟล์/โฟลเดอร์ในไดเรกทอรี files.forEach(file => { // สร้างเส้นทางแบบเต็มไปยังไฟล์/โฟลเดอร์ const filePath = path.join(dirPath, file); // ตรวจสอบว่ารายการนั้นเป็น directory if (fs.statSync(filePath).isDirectory()) { // เรียกใช้ฟังก์ชันนี้ซ้ำๆ เพื่อรับรายการซ้อนของไดเร็กทอรีย่อย const subList = getNestedList(filePath); // เพิ่มข้อมูลรายการที่ซ้อนกันไปยังรายการปัจจุบัน NestedList push({ name: file, type: 'directory', items: subList }); } else { // เพิ่มข้อมูลไฟล์ลงในรายการปัจจุบัน NestedList.push({ name: file, type: 'file' }); } }); // ส่งคืนข้อมูลรายการซ้อน กลับรายการซ้อน; } // เริ่มเซิร์ฟเวอร์บนพอร์ต 3000 app.listen(3000, () => console.log('เซิร์ฟเวอร์เริ่มต้นที่พอร์ต 3000')); ``` โปรแกรมนี้กำหนดเส้นทาง `/list/:dir(*)` ที่ใช้เส้นทางไดเร็กทอรีเป็นพารามิเตอร์และส่งคืนหน้าเว็บพร้อมกับรายการไฟล์และโฟลเดอร์ที่ซ้อนกันในไดเร็กทอรีนั้น ฟังก์ชัน `getNestedList()` ใช้เพื่อสแกนไดเร็กทอรีซ้ำๆ และสร้างข้อมูลรายการที่ซ้อนกัน เทมเพลต EJS `views/list.ejs` ใช้เพื่อแสดงผลหน้าเว็บด้วยข้อมูลรายการที่ซ้อนกัน หมายเหตุ: โปรแกรมนี้ถือว่าไดเร็กทอรีที่กำลังสแกนเป็นไดเร็กทอรีภายในเครื่องบนเซิร์ฟเวอร์ที่รันแอปพลิเคชัน Node.js หากคุณต้องการสแกนไดเร็กทอรีบนเซิร์ฟเวอร์ระยะไกลหรือจากเว็บแอปพลิเคชันฝั่งไคลเอ็นต์ คุณจะต้องแก้ไขโปรแกรมตามนั้น
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence