disk-info/bin/main.cpp
2023-04-19 21:18:15 +03:00

75 lines
2.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <iostream>
#include <sys/statvfs.h>
#include <mntent.h>
#include <cstdio>
#include <fstream>
template <typename T>
void print_in_color(const T& text, const std::string& color)
{
std::cout << "\033[" << color << "m" << text << "\033[0m";
}
template <typename T>
std::string get_size_string(const T& size)
{
if (size < 1024)
{
return std::to_string(size) + " B";
}
else if (size < 1024 * 1024)
{
return std::to_string(size / 1024) + " KB";
}
else if (size < 1024 * 1024 * 1024)
{
return std::to_string(size / 1024 / 1024) + " MB";
}
else
{
return std::to_string(size / 1024 / 1024 / 1024) + " GB";
}
}
auto main() -> int
{
try
{
std::FILE* file = std::fopen("/etc/fstab", "r");
if (file == nullptr)
throw std::runtime_error("File not found");
struct mntent* mount_entry = nullptr;
std::cout << "\n\n";
while ((mount_entry = getmntent(file)))
{
struct statvfs stat;
if (statvfs(mount_entry->mnt_dir, &stat) != 0) {
std::cerr << "Ошибка при получении информации о файловой системе: " << mount_entry->mnt_dir << "\n";
continue;
}
unsigned long long total_size = (unsigned long long)stat.f_frsize * stat.f_blocks;
unsigned long long free_size = (unsigned long long)stat.f_frsize * stat.f_bfree;
unsigned long long used_size = total_size - free_size;
std::cout << "Точка монтирования: " << mount_entry->mnt_dir << "\n";
std::cout << "Тип файловой системы: " << mount_entry->mnt_type << "\n";
std::cout << "Общий объем: ";
print_in_color(get_size_string(total_size), "0;33");
std::cout << "\nСвободное место: ";
print_in_color(get_size_string(free_size), "0;32");
std::cout << "\nИспользовано: ";
print_in_color(get_size_string(used_size), "0;35");
std::cout << "\n\n";
}
std::fclose(file);
}
catch (const std::exception& e)
{
std::cerr << e.what() << std::endl;
return 1;
}
}