![]() |
|
Модераторы: bsa |
![]()
|
|
| Nick08 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 1.11.2012 Репутация: нет Всего: нет |
Предложенная программа осуществляет поиск файлов в каталоге.
Как реализовать (как бы с ключами: /N, /D): 1)имена файлов(подкаталогов) выводились в крайнем правом столбце (dir /N). Cделал, но коряво, с помощью - cout.width()). Как "нормально" реализовать? 2)вывод списка в нескольких столбцах с сортировкой по столбцам (dir /D). Тут как сделать???
Это сообщение отредактировал(а) feodorv - 1.11.2012, 19:25 |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Наличие в программе #include <windows.h> и FindFirstFile еще не делают программу системной. Ваша задача не в том, что бы собрать список файлов (это вы сделали), а в том, что бы красиво вывести собранные строки. Это явно задача для другого раздела
Это сообщение отредактировал(а) xvr - 3.11.2012, 14:15 |
|||
|
||||
| Nick08 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 1.11.2012 Репутация: нет Всего: нет |
Понятно...ну а как хотя бы дату и время создания файлов преобразовать к нормальному виду??? Выводится везде 1.1.1601 0:0
#include <windows.h> #include <iostream> using namespace std; int main() { WIN32_FIND_DATA fd; FILETIME creationTime; SYSTEMTIME sysTime; // находим первый файл HANDLE hFindFile = FindFirstFile("C:\\matlab\\*.*", &fd); if (hFindFile == INVALID_HANDLE_VALUE) { cerr << "Find first file failed." << endl << "The last error code: " << GetLastError() << endl; cout << "Press any key to finish."; } else { // выводим на консоль имя первого файла cout.width(60); cout << "The first file name: " << fd.cFileName << endl; do { if(fd.cFileName[0] == '.') //ПРОПУСКАЕМ СЛУЖЕБНЫЕ ИМЕНА . и .. continue; else // находим следующий файл и выводим на консоль его имя GetFileTime(hFindFile, &creationTime, 0, 0); FileTimeToSystemTime(&creationTime, &sysTime); cout.width(60); cout << fd.cFileName <<" "<<sysTime.wDay<<"."<<sysTime.wMonth<<"."<<sysTime.wYear<< " "<<sysTime.wHour<<":"<<sysTime.wHour<< endl; } while (FindNextFile(hFindFile, &fd)); // закрываем дескриптор поиска FindClose(hFindFile); } system("pause"); return 0; } |
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Смотрите. Отсчёт времени в виндах сделан своеобразно - как раз от 1.1.1601 0:0
И если Вы получаете такое время, то понятно, что в функцию FileTimeToSystemTime Вы отправляете ноль - ноль 100-наносекунд, прошедших с 1 января 1601 года. Откуда же взялся 0 в creationTime? А вот откуда: hFindFile - это не хендлер открытого файла, это особый хендлер открытой директории. GetFileTime с ним не справляется и возвращает 0. Откуда же брать времена интересующего файла? Есть же структура WIN32_FIND_DATA, относящаяся как раз к текущему файлу. А там:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| Nick08 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 1.11.2012 Репутация: нет Всего: нет |
И как в итоге будет выглядеть код?
|
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Гм. Задумался о ключах от квартиры... Вместо
нужно сделать:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| Nick08 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 1.11.2012 Репутация: нет Всего: нет |
Сделал "проверку" функцией dir с ключом N. Время создания каждого файла отличается на несколько часов (где-то на несколько минут) от результата работы этой проги. В чём причина? (попробуйте проверить сами)
|
|||
|
||||
| Nick08 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 1.11.2012 Репутация: нет Всего: нет |
Немного подправил
#include <windows.h> #include <iostream> using namespace std; int main() { WIN32_FIND_DATA fd; FILETIME creationTime; SYSTEMTIME stUTC,stLocal; // находим первый файл HANDLE hFindFile = FindFirstFile("C:\\Dev-Cpp\\*.*", &fd); if (hFindFile == INVALID_HANDLE_VALUE) { cerr << "Find first file failed." << endl << "The last error code: " << GetLastError() << endl; cout << "Press any key to finish."; } else { // выводим на консоль имя первого файла cout.width(60); cout << "The first file name: " << fd.cFileName << endl; do { if(fd.cFileName[0] == '.') //ПРОПУСКАЕМ СЛУЖЕБНЫЕ ИМЕНА . и .. continue; else // находим следующий файл и выводим на консоль его имя FileTimeToSystemTime( &fd.ftCreationTime, &stUTC); SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal); cout.width(60); cout << fd.cFileName <<" "<<stLocal.wDay<<"."<<stLocal.wMonth<<"."<<stLocal.wYear<< " "<<stLocal.wHour<<":"<<stLocal.wHour<< endl; } while (FindNextFile(hFindFile, &fd)); // закрываем дескриптор поиска FindClose(hFindFile); } system("pause"); return 0; } |
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Потому что dir показывает не ftCreationTime, а ftLastWriteTime. Более того, нужно учитывать временной пояс, в котором Вы находитесь:
Потом, у Вас вместо минут часы выводятся, странно, что хоть что-то с чем-то совпадает... Добавлено через 11 минут и 34 секунды И пользуйтесь кнопкой код, пожалуйста. Ваши посты выглядят очень неряшливо((( -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| Nick08 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 1.11.2012 Репутация: нет Всего: нет |
Ошибка была только в том что вместо минут, я написал часы, а временной пояс оказывается не важным...
Добавлено через 8 минут и 4 секунды Как теперь вывести список файлов в нескольких столбцах с сортировкой по столбцам. По аналогии с функцией dir с ключом /D... Есть идея - нужно записывать имена файлов в массив. А там уже делать вывод по столбцам. Или не так? Это сообщение отредактировал(а) Nick08 - 5.11.2012, 19:19 |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Только ли? А ftLastWriteTime Вы поправили? Что под этим имеется в виду? Dir может сортировать по имени, расширению, дате и т.д. А что такое сортировка по столбцам???? Скорее всего, так и нужно будет сделать. Только вопрос: короткие имена файлов или длинные имена? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Nick08 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 1.11.2012 Репутация: нет Всего: нет |
Да, и ftLastWriteTime.
Запустите в командной строке dir с ключом /D. Нужно доработать программу так, чтобы вывод был такой же. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
У меня ОС не той системы. Что должно получиться (приведите результат)? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Т.е. сортировка по имени файла (кстати, так и не увидел длинное имя файла - что с ним будет) и вывод в несколько столбцов.
Однозначно сохранять имена файлов и файловые атрибуты в отсортированном массиве (дереве etc). То есть сначала чтение директории/папки целиком (не стоит при этом игнорировать .* файлы), потом вывод в несколько столбцов. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |