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 minuciosamente qualquer diretório e obtenha estatísticas detalhadas sobre seus arquivos e subdiretórios.

Desafio

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 a Escolher

Você tem dois caminhos à sua 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.

Passo 1: Importar os Módulos Necessários

Para iniciar esta jornada, você precisará das ferramentas certas. Comece importando dois módulos principais: fs.promises para gerenciar o sistema de arquivos de forma assíncrona e path para lidar com 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.

  • Se for bem-sucedida, retorna as estatísticas;
  • Se ocorrer um 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 examina um diretório e reúne estatísticas completas sobre seu conteúdo. Funcionamento: lê todos os itens dentro do diretório utilizando fs.readdir. Para cada item:

  • Monta o caminho completo com path.join;
  • Utiliza getStats para detectar se é um arquivo ou uma pasta;
  • Se for um arquivo:
    • Chama analyzeFile para obter { name, size };
    • Atualiza totais, maior arquivo e a lista de arquivos.
  • Se for um diretório:
    • Chama recursivamente analyzeDirectory;
    • Mescla os resultados nas estatísticas atuais.
async function analyzeDirectory(directoryPath) {
  let totalItems = 0;
  let totalFiles = 0;
  let totalSize = 0;
  let largestFile = { name: "", size: 0 };
  let fileList = [];

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

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

      totalItems++;

      if (stats.isFile()) {
        const fileInfo = await analyzeFile(itemPath);
        if (!fileInfo) continue;

        totalFiles++;
        totalSize += fileInfo.size;

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

        fileList.push(fileInfo);
      } 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 de 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();

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) {
  let totalItems = 0;
  let totalFiles = 0;
  let totalSize = 0;
  let largestFile = { name: "", size: 0 };
  let fileList = [];

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

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

      totalItems++;

      if (stats.isFile()) {
        const fileInfo = await analyzeFile(itemPath);
        if (!fileInfo) continue;

        totalFiles++;
        totalSize += fileInfo.size;

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

        fileList.push(fileInfo);
      } 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

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 minuciosamente qualquer diretório e obtenha estatísticas detalhadas sobre seus arquivos e subdiretórios.

Desafio

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 a Escolher

Você tem dois caminhos à sua 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.

Passo 1: Importar os Módulos Necessários

Para iniciar esta jornada, você precisará das ferramentas certas. Comece importando dois módulos principais: fs.promises para gerenciar o sistema de arquivos de forma assíncrona e path para lidar com 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.

  • Se for bem-sucedida, retorna as estatísticas;
  • Se ocorrer um 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 examina um diretório e reúne estatísticas completas sobre seu conteúdo. Funcionamento: lê todos os itens dentro do diretório utilizando fs.readdir. Para cada item:

  • Monta o caminho completo com path.join;
  • Utiliza getStats para detectar se é um arquivo ou uma pasta;
  • Se for um arquivo:
    • Chama analyzeFile para obter { name, size };
    • Atualiza totais, maior arquivo e a lista de arquivos.
  • Se for um diretório:
    • Chama recursivamente analyzeDirectory;
    • Mescla os resultados nas estatísticas atuais.
async function analyzeDirectory(directoryPath) {
  let totalItems = 0;
  let totalFiles = 0;
  let totalSize = 0;
  let largestFile = { name: "", size: 0 };
  let fileList = [];

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

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

      totalItems++;

      if (stats.isFile()) {
        const fileInfo = await analyzeFile(itemPath);
        if (!fileInfo) continue;

        totalFiles++;
        totalSize += fileInfo.size;

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

        fileList.push(fileInfo);
      } 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 de 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();

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) {
  let totalItems = 0;
  let totalFiles = 0;
  let totalSize = 0;
  let largestFile = { name: "", size: 0 };
  let fileList = [];

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

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

      totalItems++;

      if (stats.isFile()) {
        const fileInfo = await analyzeFile(itemPath);
        if (!fileInfo) continue;

        totalFiles++;
        totalSize += fileInfo.size;

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

        fileList.push(fileInfo);
      } 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