Файловая система, команда dir

Уровень сложности:

Написать программу, которая будет выполнять функцию команды dir (просмотр содержимого текущей директории) в операционной системе Microsoft DOS. Данная команда выводит на экран список папок  и файлов, которые содержаться в текущем  каталоге.
Программа должна выводить на экран следующую информацию о файлах:

  • имя файла или папки;
  • размер файла;
  • дата последнего изменения файла,
  • файловые атрибуты ( скрытый файл, файл только для чтения).

Примечание: все пустые файлы отметьте знаком минус -.

К сожалению, решения данной задачи пока нет. Если Вы решили эту задачу, сообщите нам, и мы выложим её на сайте.

E-mail : admin@cppstudio.com

Следующие статьи помогут вам в решении данной задачи:
Автор: admin
Дата: 12.09.2012
Поделиться:

Комментарии

  1. Lee Amstrong

    Собстна, под рукой winapi не было, зато было linuxapi и 17й стандарт. Собстна в линуксятне нет такого понятия как скрытый файл (на системном уровне). Поэтому вместо файловых атрибутов в моем коде будет отображаться права владельца файла, тобишь read, write, execute.

    Собстна и под виндой скомпилится/запустится, ибо кроме 17го стандарта ничео не использовал, никаких системных линуксовых библиотек.

    Код пытался написать максимально понятным. Пишите в вконтактик если че — vk.com/bat9mmasss

    #include <iostream>
    #include <experimental/filesystem>
    #include <chrono>
    #include <iomanip> //std::put_time
    #include <string>
    #include <sstream>
    #include <cmath> //pow
    #include <locale>
    
    namespace fs = std::experimental::filesystem;
    
    struct FileData {
       std::string name;
       std::string size;
       std::string writeDate;
       std::string rwx;
    };
    
    //Форматирует циферку (кол-во байт) в удобочитаемый вид, округляя до 0.1
    std::string fsizeFormat(size_t bytes){
       std::vector<std::string> names = {"b", "kb", "Mb", "Gb"};
       const int bytesInKb = 1024;
       for (size_t i = 0; i < names.size(); i++) {
          float result = (float)bytes / pow(bytesInKb, i);
          if(result < bytesInKb) {
             std::stringstream ss;
             ss << std::fixed << std::setprecision(1) << result <<" " << names[i];
             return ss.str();
          }
       }
       return std::to_string(bytes);
    }
    
    //time to string
    std::string timeFormat(auto time) {
       std::time_t cftime = decltype(time)::clock::to_time_t(time);
       std::stringstream ss;
       ss << std::put_time(std::localtime(&cftime), "%Y.%m.%d");
       return ss.str();
    }
    
    //rwx линуксовские права для владельца
    std::string permsFormat(fs::perms p){
       std::stringstream ss;
       ss << ((p & fs::perms::owner_read ) != fs::perms::none ? "r" : "-")
          << ((p & fs::perms::owner_write) != fs::perms::none ? "w" : "-")
          << ((p & fs::perms::owner_exec ) != fs::perms::none ? "x" : "-");
       return ss.str();
    }
    
    int main(int argc, char const *argv[]) {
       //Вектор структур с инфой о файлах, которые позже отформатируем (выровняем по ширине для красивого вывода).
       std::vector<FileData> report;
       //обход дирректории
       for (auto &dirEntry : fs::directory_iterator( fs::current_path() )) {
          fs::path path = dirEntry.path();
          FileData fdata;
          fdata.name = path.filename().c_str();
          //Если обычный файл, то "fsizeFormat()", иначе "-"
          fdata.size = (fs::is_regular_file(path) ? fsizeFormat(fs::file_size(path)) : "-");
          fdata.writeDate = timeFormat(fs::last_write_time(path));
          fdata.rwx = permsFormat(fs::status(path).permissions());
          report.push_back(fdata);
       }
       //На этом моменте вектор "report" У нас заполнен, его можно вывести, или отформатировать для красивого вывода
       //Суть форматирования заключается в том, что мы находим размер максимальной строки в столбце, а остальные дополняем
       //пробелами до нужного размера
    
       size_t maxCollumnName = 0;
       size_t maxCollumnSize = 0;
       size_t maxCollumnDate = 0;
    
       for (auto& fdata : report) {
          maxCollumnName = (fdata.name.size() > maxCollumnName ? fdata.name.size() : maxCollumnName);
       }
       for (auto& fdata : report) {
          maxCollumnSize = (fdata.size.length() > maxCollumnSize ? fdata.size.length() : maxCollumnSize);
       }
       for (auto& fdata : report) {
          maxCollumnDate = (fdata.writeDate.size() > maxCollumnDate ? fdata.writeDate.size() : maxCollumnDate);
       }
       for (auto& fdata : report) {
          fdata.name      += std::string((maxCollumnName-fdata.name.size()), ' ');
          fdata.size      += std::string((maxCollumnSize-fdata.size.size()), ' ');
          fdata.writeDate += std::string((maxCollumnDate-fdata.writeDate.size()), ' ');
       }
       //Выводим в консоль
       for (auto& fdata : report) {
          std::cout << fdata.name << " | " << fdata.size << " | " << fdata.writeDate << " | " << fdata.rwx << '\n';
       }
       return 0;
    }

     

  2. Никита Трушин

     

    //<em>CppStudio_Dir.cpp</em>
    
    #include "stdafx.h"
    #include "CppStudio_Dir.h"
    
    void _ls(wchar_t * path)
    {
    	WIN32_FIND_DATA fData;
    	HANDLE hFile = FindFirstFile(path, &amp;fData);
    	if (hFile != INVALID_HANDLE_VALUE)
    		for (write_console(fData); FindNextFile(hFile, &amp;fData); write_console(fData));
    }
    
    wchar_t * write_attributes(DWORD dwAttributes)
    {
    	switch (dwAttributes)
    	{
    	case FILE_ATTRIBUTE_ARCHIVE:
    		return L"Архивный файл или каталог";
    	case FILE_ATTRIBUTE_COMPRESSED:
    		return L"Сжатый файл";
    	case FILE_ATTRIBUTE_DIRECTORY:
    		return L"Каталог";
    	case FILE_ATTRIBUTE_ENCRYPTED:
    		return L"Зашифрованный";
    	case FILE_ATTRIBUTE_HIDDEN:
    		return L"Скрытый";
    	case FILE_ATTRIBUTE_NORMAL:
    		return L"Скрытый";
    	case FILE_ATTRIBUTE_OFFLINE:
    		return L"Физически перемещенные данные";
    	case FILE_ATTRIBUTE_READONLY:
    		return L"Только чтение";
    	case FILE_ATTRIBUTE_REPARSE_POINT:
    		return L"Имеет связанную точку монтирования";
    	case FILE_ATTRIBUTE_SPARSE_FILE:
    		return L"Разреженный файл";
    	case FILE_ATTRIBUTE_SYSTEM:
    		return L"Системный файл";
    	case FILE_ATTRIBUTE_TEMPORARY:
    		return L"Временный файл";
    	default:
    		return NULL;
    	}
    }
    
    void write_console(WIN32_FIND_DATA data)
    {
    	SYSTEMTIME time;
    	FileTimeToSystemTime(&amp;data.ftLastWriteTime, &amp;time);
    	LPSYSTEMTIME LP_time = &amp;time;
    	if ((data.nFileSizeHigh * (MAXDWORD + 1)) + data.nFileSizeLow)
    	{
    		std::wcout &lt;&lt; data.cFileName &lt;&lt; "\t\t\t" &lt;&lt; write_attributes(data.dwFileAttributes) &lt;&lt; "\t\t\t" &lt;  &lt; (data.nFileSizeHigh * (MAXDWORD + 1)) + data.nFileSizeLow &lt;&lt; " Byte " &lt;&lt; LP_time-&gt;wHour &lt;&lt; ":" &lt;&lt; LP_time-&gt;wMinute &lt;&lt; " " &lt;&lt; LP_time-&gt;wDay &lt;&lt; "/" &lt;&lt; LP_time-&gt;wMonth &lt;&lt; "/" &lt;&lt; LP_time-&gt;wYear &lt;&lt; "\n";
    	}
    	else
    	{
    		std::wcout &lt;&lt; data.cFileName &lt;&lt; "\t\t\t" &lt;&lt; write_attributes(data.dwFileAttributes) &lt;&lt; "\t\t\t" &lt;&lt; '-'&lt;&lt; " Byte " &lt;&lt; LP_time-&gt;wHour &lt;&lt; ":" &lt;&lt; LP_time-&gt;wMinute &lt;&lt; " " &lt;&lt; LP_time-&gt;wDay &lt;&lt; "/" &lt;&lt; LP_time-&gt;wMonth &lt;&lt; "/" &lt;&lt; LP_time-&gt;wYear &lt;&lt; "\n";
    	}
    }
    
    int wmain()
    {
    	wchar_t * current_work_dir = new wchar_t[FILENAME_MAX];
    	_wgetcwd(current_work_dir, FILENAME_MAX);
    	setlocale(LC_ALL, "rus");
    	_ls(L"./*");
    	system("pause");
    	return 0;
    }
    
    <em>//CppStudio_Dir.h</em>
    
    #include &lt;Windows.h&gt;
    #include &lt;iostream&gt;
    
    void _ls(wchar_t * path);
    void write_console(WIN32_FIND_DATA data);
  3. petruska

    petruska

    я конечно понимаю,что это не совсем то.что требуется,но все же xDD

    #include "stdafx.h" // here all libs
    int _tmain(int argc, _TCHAR* argv[])
    {
    	system("dir");
    	return 0;
    }
  4. Ivan Cheltsoff

    RedMagChipPRO

    Ого… Здесь WinAPI нужен, не меньше…

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.