Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рекурсивный обход каталогов 
:(
    Опции темы
worsvch
Дата 23.2.2012, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Пишу консольное приложение под windows xp, смысл его в следующем:
есть определенный каталог и в нем еще куча вложенных каталогов с файлами. Нужно удалить все файлы из вложенных каталогов. Подскажите, пожалуйста, какие заголовочные файлы нужно подключить и какие функции нужно использовать? Искал в инете образцы кода, ничего того что нужно не нашел.
PM MAIL   Вверх
rumit7
Дата 23.2.2012, 13:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: нет
Всего: 7



Цитата(worsvch @ 23.2.2012,  11:48)
Пишу консольное приложение под windows xp, смысл его в следующем:
есть определенный каталог и в нем еще куча вложенных каталогов с файлами. Нужно удалить все файлы из вложенных каталогов. Подскажите, пожалуйста, какие заголовочные файлы нужно подключить и какие функции нужно использовать? Искал в инете образцы кода, ничего того что нужно не нашел.

Если я не ошибаюсь, то Вам лучше использовать WinAPI, а для этого имеется специальный раздел.

В WinAPI имеется функция FindFirstFile (или на русском), при помощи которой можно выполнить "рекурсивный обход каталогов".

Вот здесь есть примеры:

1) http://www.devasp.net/net/articles/display/652.html
2) http://stackoverflow.com/questions/2038912...in-c-on-windows
3) http://www.codeproject.com/Articles/93141/...vely-Enumeratin

Научитесь находить нужные файлы, а потом используя функцию DeleteFile можно и удалить их. 

P.S. Оказывается в boost.filesystem тоже имеется необходимый функционал.

Добавлено через 5 минут и 26 секунд
Здесь неплохое введение в использование boost.filesystem:

1) http://www.ibm.com/developerworks/aix/library/au-boostfs/
2) http://www.solarix.ru/for_developers/cpp/b.../ru/index.shtml
PM MAIL   Вверх
worsvch
Дата 26.2.2012, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Цитата(rumit7 @ 23.2.2012,  13:44)
Если я не ошибаюсь, то Вам лучше использовать WinAPI, а для этого имеется специальный раздел.

В WinAPI имеется функция FindFirstFile (или на русском), при помощи которой можно выполнить "рекурсивный обход каталогов".

Сделал следующее:
Код

#include "stdafx.h"
#include "windows.h"
#include "direct.h"
#include <iostream>

using namespace std;

LPCWSTR fileMask = L"*.*"; 
HANDLE fileHandle;
WIN32_FIND_DATA findFile;
const char* data_dir = "c:\\data"; 

int _tmain(int argc, _TCHAR* argv[])
{
    int x = 0;
    // рекурсивно обходим все каталоги и удаляем файлы в них
    _chdir(data_dir);
    fileHandle = FindFirstFile(fileMask,&findFile);
    cout << findFile.cFileName << endl;
    if (fileHandle != INVALID_HANDLE_VALUE) {
        while (FindNextFile(fileHandle,&findFile)) {
            cout << findFile.cFileName << endl;
        }
    }
    FindClose(fileHandle);
    
    return 0;
}


В консоли вместо имен файлов, одинаковые значения: 0041B1C7
Как так?


Это сообщение отредактировал(а) worsvch - 26.2.2012, 09:20
PM MAIL   Вверх
Dem_max
Дата 26.2.2012, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39





--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
rumit7
Дата 26.2.2012, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: нет
Всего: 7



Цитата(worsvch @ 26.2.2012,  09:19)
Сделал следующее:
[...]
В консоли вместо имен файлов, одинаковые значения: 0041B1C7
Как так?

У Вас проблема с выводом на консоль юникод строки:

Код

cout << findFile.cFileName << endl;


 Вместо объекта "cout" попробуйте использовать его юникод аналог "wcout" или функцию "_tprintf".

Добавлено @ 12:49
Кроме того, Вы не проходите рекурсивно внутрь вложенных директорий. Для этого, Вам нужно создать отдельную функцию, которую Вы и будите вызывать рекурсивно для вложенных директорий. В качестве примера, смотрите второй ответ вот здесь http://stackoverflow.com/questions/2038912...in-c-on-windows. 

Добавлено @ 12:54
Имейте ввиду что данный пример может содержать ошибки, он просто чтобы показать куда копать..

Это сообщение отредактировал(а) rumit7 - 26.2.2012, 12:54
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.