Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Ferramenta de Inspeção de Diretórios | Construindo Aplicações de Console com Node.js
Desenvolvimento Backend com Node.js e Express.js

bookFerramenta de Inspeção de Diretórios

Este capítulo apresenta um desafio: criar um aplicativo de console avançado chamado DirInspect Pro. Este aplicativo permitirá que você analise detalhadamente qualquer diretório e obtenha estatísticas relevantes sobre seus arquivos e subdiretórios.

🏆 Desafio à Frente

Imagine um cenário em que é necessário navegar por um labirinto de pastas contendo arquivos e dados essenciais. O DirInspect Pro é seu aliado nessa jornada, fornecendo informações abrangentes sobre a estrutura e o conteúdo do diretório.

🚀 O Aplicativo Resultante

Prepare-se para utilizar os recursos do DirInspect Pro. O aplicativo fornecerá informações essenciais, como

  • O número total de itens;
  • O tamanho agregado de todos os itens;
  • O nome e o tamanho do maior arquivo;
  • A lista detalhada dos nomes e tamanhos de cada arquivo individual.

Dois Caminhos para Escolher

Você tem dois caminhos à frente.

  • O primeiro é enfrentar este desafio diretamente, aprimorando suas habilidades sem orientação;
  • O segundo é seguir um guia útil que garante seu sucesso.

Independentemente do caminho escolhido, você terá uma jornada recompensadora que culmina na criação de um aplicativo de console envolvente e funcional.

Plano Mestre

  • 👉 Passo 1: Importar os módulos necessários;
  • 👉 Passo 2: Definir a função getStats;
  • 👉 Passo 3: Definir a função analyzeFile;
  • 👉 Passo 4: Definir a função analyzeDirectory;
  • 👉 Passo 5: Definir e invocar a função main;
  • 🎉 Conclusão;
  • 🏁 Código completo do aplicativo.

Etapa 1: Importar Módulos Necessários

Para iniciar esta tarefa, é necessário utilizar as ferramentas corretas. Comece importando dois módulos principais: fs.promises para gerenciar o sistema de arquivos de forma assíncrona e path para manipular caminhos de arquivos de maneira eficiente.

const fs = require("fs").promises;
const path = require("path");

Etapa 2: Definir a Função getStats

A função assíncrona getStats recebe um caminho de arquivo ou diretório como argumento e tenta obter suas estatísticas utilizando fs.stat.

  • Em caso de sucesso, retorna as estatísticas;
  • Em caso de erro, registra uma mensagem de erro e retorna null.
async function getStats(filePath) {
  try {
    const stats = await fs.stat(filePath);
    return stats;
  } catch (err) {
    console.error("Error getting stats:", err.message);
    return null;
  }
}

Etapa 3: Definir a Função analyzeFile

A função analyzeFile utiliza a função getStats para obter as estatísticas de um arquivo. Se as estatísticas estiverem disponíveis (diferente de null), retorna um objeto contendo o nome do arquivo (extraído com path.basename) e seu tamanho.

async function analyzeFile(filePath) {
  const stats = await getStats(filePath);
  if (!stats) return null;

  return {
    name: path.basename(filePath),
    size: stats.size,
  };
}

Etapa 4: Definir a função analyzeDirectory

A função analyzeDirectory recebe um caminho de diretório como argumento e analisa de forma abrangente seu conteúdo.

  • Ela começa lendo os itens dentro do diretório usando fs.readdir e, em seguida, itera sobre cada item;
  • Para cada item, constrói o caminho completo usando path.join e recupera suas estatísticas utilizando a função getStats;
  • Se as stats indicarem que o item é um arquivo, atualiza as estatísticas relacionadas a arquivos;
  • Se o item for um subdiretório, chama recursivamente a função analyzeDirectory para analisar seu conteúdo e, então, agrega as estatísticas.
async function analyzeDirectory(directoryPath) {
  try {
    const items = await fs.readdir(directoryPath);
    let totalItems = 0;
    let totalFiles = 0;
    let totalSize = 0;
    let largestFile = { name: "", size: 0 };
    let fileList = [];

    for (const item of items) {
      const itemPath = path.join(directoryPath, item);
      const stats = await getStats(itemPath);
      if (!stats) continue;

      totalItems++;

      if (stats.isFile()) {
        totalFiles++;
        totalSize += stats.size;

        if (stats.size > largestFile.size) {
          largestFile = { name: item, size: stats.size };
        }

        fileList.push({ name: item, size: stats.size });
      } else if (stats.isDirectory()) {
        const subDirectoryStats = await analyzeDirectory(itemPath);
        totalItems += subDirectoryStats.totalItems;
        totalFiles += subDirectoryStats.totalFiles;
        totalSize += subDirectoryStats.totalSize;

        if (subDirectoryStats.largestFile.size > largestFile.size) {
          largestFile = subDirectoryStats.largestFile;
        }

        fileList = fileList.concat(subDirectoryStats.fileList);
      }
    }

    return {
      totalItems,
      totalFiles,
      totalSize,
      largestFile,
      fileList,
    };
  } catch (err) {
    console.error("Error analyzing directory contents:", err.message);
    return {
      totalItems: 0,
      totalFiles: 0,
      totalSize: 0,
      largestFile: { name: "", size: 0 },
      fileList: [],
    };
  }
}

Etapa 5: Definir a função main e invocar

A função main é o ponto de entrada do script. Ela especifica o caminho do diretório a ser analisado (neste caso, ./docs), chama a função analyzeDirectory para obter as estatísticas do diretório e seu conteúdo, e então exibe as informações coletadas. A função imprime

  • O número total de itens;
  • O número total de arquivos;
  • O tamanho total;
  • Os detalhes sobre o maior arquivo;
  • A lista de arquivos no diretório.
async function main() {
  const directoryPath = "./docs";
  const directoryStats = await analyzeDirectory(directoryPath);

  console.log("Directory Analysis:");
  console.log("Total items:", directoryStats.totalItems);
  console.log("Total files:", directoryStats.totalFiles);
  console.log("Total size (bytes):", directoryStats.totalSize);
  console.log(
    "Largest file:",
    directoryStats.largestFile.name,
    "Size:",
    directoryStats.largestFile.size,
    "bytes"
  );

  console.log("\nFile List:");
  for (const file of directoryStats.fileList) {
    console.log(file.name, "Size:", file.size, "bytes");
  }
}

main();

🎉 Conclusão: Habilidades Dominadas

Com o DirInspect Pro, você dominou a arte de analisar diretórios como um profissional. Este aplicativo de console demonstra sua capacidade de extrair estatísticas de arquivos, lidar com erros de forma eficiente e revelar insights relevantes sobre arquivos e subdiretórios dentro de um diretório especificado.

👨‍💻 Código Completo do Aplicativo

const fs = require("fs").promises;
const path = require("path");

async function getStats(filePath) {
  try {
    const stats = await fs.stat(filePath);
    return stats;
  } catch (err) {
    console.error("Error getting stats:", err.message);
    return null;
  }
}

async function analyzeFile(filePath) {
  const stats = await getStats(filePath);
  if (!stats) return null;

  return {
    name: path.basename(filePath),
    size: stats.size,
  };
}

async function analyzeDirectory(directoryPath) {
  try {
    const items = await fs.readdir(directoryPath);

    let totalItems = 0;
    let totalFiles = 0;
    let totalSize = 0;
    let largestFile = { name: "", size: 0 };
    let fileList = [];

    for (const item of items) {
      const itemPath = path.join(directoryPath, item);
      const stats = await getStats(itemPath);
      if (!stats) continue;

      totalItems++;

      if (stats.isFile()) {
        totalFiles++;
        totalSize += stats.size;

        if (stats.size > largestFile.size) {
          largestFile = { name: item, size: stats.size };
        }

        fileList.push({ name: item, size: stats.size });
      } else if (stats.isDirectory()) {
        const subDirectoryStats = await analyzeDirectory(itemPath);
        totalItems += subDirectoryStats.totalItems;
        totalFiles += subDirectoryStats.totalFiles;
        totalSize += subDirectoryStats.totalSize;

        if (subDirectoryStats.largestFile.size > largestFile.size) {
          largestFile = subDirectoryStats.largestFile;
        }

        fileList = fileList.concat(subDirectoryStats.fileList);
      }
    }

    return {
      totalItems,
      totalFiles,
      totalSize,
      largestFile,
      fileList,
    };
  } catch (err) {
    console.error("Error analyzing directory contents:", err.message);
    return {
      totalItems: 0,
      totalFiles: 0,
      totalSize: 0,
      largestFile: { name: "", size: 0 },
      fileList: [],
    };
  }
}

async function main() {
  const directoryPath = "./docs";

  const directoryStats = await analyzeDirectory(directoryPath);

  console.log("Directory Analysis:");
  console.log("Total items:", directoryStats.totalItems);
  console.log("Total files:", directoryStats.totalFiles);
  console.log("Total size (bytes):", directoryStats.totalSize);
  console.log(
    "Largest file:",
    directoryStats.largestFile.name,
    "Size:",
    directoryStats.largestFile.size,
    "bytes"
  );

  console.log("\nFile List:");
  for (const file of directoryStats.fileList) {
    console.log(file.name, "Size:", file.size, "bytes");
  }
}

main();

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 10

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Awesome!

Completion rate improved to 2.56

bookFerramenta de Inspeção de Diretórios

Deslize para mostrar o menu

Este capítulo apresenta um desafio: criar um aplicativo de console avançado chamado DirInspect Pro. Este aplicativo permitirá que você analise detalhadamente qualquer diretório e obtenha estatísticas relevantes sobre seus arquivos e subdiretórios.

🏆 Desafio à Frente

Imagine um cenário em que é necessário navegar por um labirinto de pastas contendo arquivos e dados essenciais. O DirInspect Pro é seu aliado nessa jornada, fornecendo informações abrangentes sobre a estrutura e o conteúdo do diretório.

🚀 O Aplicativo Resultante

Prepare-se para utilizar os recursos do DirInspect Pro. O aplicativo fornecerá informações essenciais, como

  • O número total de itens;
  • O tamanho agregado de todos os itens;
  • O nome e o tamanho do maior arquivo;
  • A lista detalhada dos nomes e tamanhos de cada arquivo individual.

Dois Caminhos para Escolher

Você tem dois caminhos à frente.

  • O primeiro é enfrentar este desafio diretamente, aprimorando suas habilidades sem orientação;
  • O segundo é seguir um guia útil que garante seu sucesso.

Independentemente do caminho escolhido, você terá uma jornada recompensadora que culmina na criação de um aplicativo de console envolvente e funcional.

Plano Mestre

  • 👉 Passo 1: Importar os módulos necessários;
  • 👉 Passo 2: Definir a função getStats;
  • 👉 Passo 3: Definir a função analyzeFile;
  • 👉 Passo 4: Definir a função analyzeDirectory;
  • 👉 Passo 5: Definir e invocar a função main;
  • 🎉 Conclusão;
  • 🏁 Código completo do aplicativo.

Etapa 1: Importar Módulos Necessários

Para iniciar esta tarefa, é necessário utilizar as ferramentas corretas. Comece importando dois módulos principais: fs.promises para gerenciar o sistema de arquivos de forma assíncrona e path para manipular caminhos de arquivos de maneira eficiente.

const fs = require("fs").promises;
const path = require("path");

Etapa 2: Definir a Função getStats

A função assíncrona getStats recebe um caminho de arquivo ou diretório como argumento e tenta obter suas estatísticas utilizando fs.stat.

  • Em caso de sucesso, retorna as estatísticas;
  • Em caso de erro, registra uma mensagem de erro e retorna null.
async function getStats(filePath) {
  try {
    const stats = await fs.stat(filePath);
    return stats;
  } catch (err) {
    console.error("Error getting stats:", err.message);
    return null;
  }
}

Etapa 3: Definir a Função analyzeFile

A função analyzeFile utiliza a função getStats para obter as estatísticas de um arquivo. Se as estatísticas estiverem disponíveis (diferente de null), retorna um objeto contendo o nome do arquivo (extraído com path.basename) e seu tamanho.

async function analyzeFile(filePath) {
  const stats = await getStats(filePath);
  if (!stats) return null;

  return {
    name: path.basename(filePath),
    size: stats.size,
  };
}

Etapa 4: Definir a função analyzeDirectory

A função analyzeDirectory recebe um caminho de diretório como argumento e analisa de forma abrangente seu conteúdo.

  • Ela começa lendo os itens dentro do diretório usando fs.readdir e, em seguida, itera sobre cada item;
  • Para cada item, constrói o caminho completo usando path.join e recupera suas estatísticas utilizando a função getStats;
  • Se as stats indicarem que o item é um arquivo, atualiza as estatísticas relacionadas a arquivos;
  • Se o item for um subdiretório, chama recursivamente a função analyzeDirectory para analisar seu conteúdo e, então, agrega as estatísticas.
async function analyzeDirectory(directoryPath) {
  try {
    const items = await fs.readdir(directoryPath);
    let totalItems = 0;
    let totalFiles = 0;
    let totalSize = 0;
    let largestFile = { name: "", size: 0 };
    let fileList = [];

    for (const item of items) {
      const itemPath = path.join(directoryPath, item);
      const stats = await getStats(itemPath);
      if (!stats) continue;

      totalItems++;

      if (stats.isFile()) {
        totalFiles++;
        totalSize += stats.size;

        if (stats.size > largestFile.size) {
          largestFile = { name: item, size: stats.size };
        }

        fileList.push({ name: item, size: stats.size });
      } else if (stats.isDirectory()) {
        const subDirectoryStats = await analyzeDirectory(itemPath);
        totalItems += subDirectoryStats.totalItems;
        totalFiles += subDirectoryStats.totalFiles;
        totalSize += subDirectoryStats.totalSize;

        if (subDirectoryStats.largestFile.size > largestFile.size) {
          largestFile = subDirectoryStats.largestFile;
        }

        fileList = fileList.concat(subDirectoryStats.fileList);
      }
    }

    return {
      totalItems,
      totalFiles,
      totalSize,
      largestFile,
      fileList,
    };
  } catch (err) {
    console.error("Error analyzing directory contents:", err.message);
    return {
      totalItems: 0,
      totalFiles: 0,
      totalSize: 0,
      largestFile: { name: "", size: 0 },
      fileList: [],
    };
  }
}

Etapa 5: Definir a função main e invocar

A função main é o ponto de entrada do script. Ela especifica o caminho do diretório a ser analisado (neste caso, ./docs), chama a função analyzeDirectory para obter as estatísticas do diretório e seu conteúdo, e então exibe as informações coletadas. A função imprime

  • O número total de itens;
  • O número total de arquivos;
  • O tamanho total;
  • Os detalhes sobre o maior arquivo;
  • A lista de arquivos no diretório.
async function main() {
  const directoryPath = "./docs";
  const directoryStats = await analyzeDirectory(directoryPath);

  console.log("Directory Analysis:");
  console.log("Total items:", directoryStats.totalItems);
  console.log("Total files:", directoryStats.totalFiles);
  console.log("Total size (bytes):", directoryStats.totalSize);
  console.log(
    "Largest file:",
    directoryStats.largestFile.name,
    "Size:",
    directoryStats.largestFile.size,
    "bytes"
  );

  console.log("\nFile List:");
  for (const file of directoryStats.fileList) {
    console.log(file.name, "Size:", file.size, "bytes");
  }
}

main();

🎉 Conclusão: Habilidades Dominadas

Com o DirInspect Pro, você dominou a arte de analisar diretórios como um profissional. Este aplicativo de console demonstra sua capacidade de extrair estatísticas de arquivos, lidar com erros de forma eficiente e revelar insights relevantes sobre arquivos e subdiretórios dentro de um diretório especificado.

👨‍💻 Código Completo do Aplicativo

const fs = require("fs").promises;
const path = require("path");

async function getStats(filePath) {
  try {
    const stats = await fs.stat(filePath);
    return stats;
  } catch (err) {
    console.error("Error getting stats:", err.message);
    return null;
  }
}

async function analyzeFile(filePath) {
  const stats = await getStats(filePath);
  if (!stats) return null;

  return {
    name: path.basename(filePath),
    size: stats.size,
  };
}

async function analyzeDirectory(directoryPath) {
  try {
    const items = await fs.readdir(directoryPath);

    let totalItems = 0;
    let totalFiles = 0;
    let totalSize = 0;
    let largestFile = { name: "", size: 0 };
    let fileList = [];

    for (const item of items) {
      const itemPath = path.join(directoryPath, item);
      const stats = await getStats(itemPath);
      if (!stats) continue;

      totalItems++;

      if (stats.isFile()) {
        totalFiles++;
        totalSize += stats.size;

        if (stats.size > largestFile.size) {
          largestFile = { name: item, size: stats.size };
        }

        fileList.push({ name: item, size: stats.size });
      } else if (stats.isDirectory()) {
        const subDirectoryStats = await analyzeDirectory(itemPath);
        totalItems += subDirectoryStats.totalItems;
        totalFiles += subDirectoryStats.totalFiles;
        totalSize += subDirectoryStats.totalSize;

        if (subDirectoryStats.largestFile.size > largestFile.size) {
          largestFile = subDirectoryStats.largestFile;
        }

        fileList = fileList.concat(subDirectoryStats.fileList);
      }
    }

    return {
      totalItems,
      totalFiles,
      totalSize,
      largestFile,
      fileList,
    };
  } catch (err) {
    console.error("Error analyzing directory contents:", err.message);
    return {
      totalItems: 0,
      totalFiles: 0,
      totalSize: 0,
      largestFile: { name: "", size: 0 },
      fileList: [],
    };
  }
}

async function main() {
  const directoryPath = "./docs";

  const directoryStats = await analyzeDirectory(directoryPath);

  console.log("Directory Analysis:");
  console.log("Total items:", directoryStats.totalItems);
  console.log("Total files:", directoryStats.totalFiles);
  console.log("Total size (bytes):", directoryStats.totalSize);
  console.log(
    "Largest file:",
    directoryStats.largestFile.name,
    "Size:",
    directoryStats.largestFile.size,
    "bytes"
  );

  console.log("\nFile List:");
  for (const file of directoryStats.fileList) {
    console.log(file.name, "Size:", file.size, "bytes");
  }
}

main();

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 10
some-alt