Написать программу, которая будет выполнять функцию команды dir (просмотр содержимого текущей директории) в операционной системе Microsoft DOS. Данная команда выводит на экран список папок и файлов, которые содержаться в текущем каталоге.
Программа должна выводить на экран следующую информацию о файлах:
- имя файла или папки;
- размер файла;
- дата последнего изменения файла,
- файловые атрибуты ( скрытый файл, файл только для чтения).
Примечание: все пустые файлы отметьте знаком минус -.
К сожалению, решения данной задачи пока нет. Если Вы решили эту задачу, сообщите нам, и мы выложим её на сайте.
E-mail : admin@cppstudio.com
Комментарии
Lee Amstrong
http://dl3.joxi.net/drive/2018/07/05/0004/1779/300787/87/aa4e4e3084.png
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; }Никита Трушин
//<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, &fData); if (hFile != INVALID_HANDLE_VALUE) for (write_console(fData); FindNextFile(hFile, &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(&data.ftLastWriteTime, &time); LPSYSTEMTIME LP_time = &time; if ((data.nFileSizeHigh * (MAXDWORD + 1)) + data.nFileSizeLow) { std::wcout << data.cFileName << "\t\t\t" << write_attributes(data.dwFileAttributes) << "\t\t\t" < < (data.nFileSizeHigh * (MAXDWORD + 1)) + data.nFileSizeLow << " Byte " << LP_time->wHour << ":" << LP_time->wMinute << " " << LP_time->wDay << "/" << LP_time->wMonth << "/" << LP_time->wYear << "\n"; } else { std::wcout << data.cFileName << "\t\t\t" << write_attributes(data.dwFileAttributes) << "\t\t\t" << '-'<< " Byte " << LP_time->wHour << ":" << LP_time->wMinute << " " << LP_time->wDay << "/" << LP_time->wMonth << "/" << LP_time->wYear << "\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 <Windows.h> #include <iostream> void _ls(wchar_t * path); void write_console(WIN32_FIND_DATA data);petruska
я конечно понимаю,что это не совсем то.что требуется,но все же xDD
#include "stdafx.h" // here all libs int _tmain(int argc, _TCHAR* argv[]) { system("dir"); return 0; }RedMagChipPRO
Ого… Здесь WinAPI нужен, не меньше…