Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2012, 13:12   #1
Dodge_wow
Пользователь
 
Регистрация: 16.08.2011
Сообщений: 11
По умолчанию Tree - иерархическое дерево каталогов. Идеи?!

Цель: прочитать все каталоги, начиная с указанного, и вывести результат в виде иерархического дерева в указанный файл. Вообщем программа полностью аналогична системной команде tree.com.

Каталоги я прохожу рекурсивно с помощью функций FindFirstFile и FindNextFile. Здесь проблем не возникло. Но при выводе возникла проблема с "соединяющими каталоги линиями".
Возникли вопросы:
1) Как определить что читаемый каталог последний? (чтобы поставить заканчивающий знак "L")
2) Как определить что в папке нет каталогов? (чтобы не "рисовать" линий в данной папке)
3) Может есть другие идеи для вывода дерева?

PHP код:
#include "stdafx.h"
#include "windows.h"
#include "conio.h"
#include <iostream>

#define N 2160

void printf_tree(char *buf) {
    
printf("%s"buf);
}

void parser(char *bufint xchar *filenameint ch) {
    for (
int j 0x+= 5) {
        switch(
buf[j]){
            
// 195
            
case -61:
                if ((
== x-5)&&(ch == 0)) {
                    
buf[j] = 195;
                    
int ii j+1;
                    for(; 
ii xii++){
                        
buf[ii] = 196;
                    }
                    
buf[ii] = '\x0';
                    
CharToOem(filename,filename);
                    
strcat(buffilename);
                } else {
                    
buf[j] = -77;
                    for(
int k j+1j+5k++) buf[k] = 32
                }
                break;
            
// 192
            
case -64:
                break;
            
// 32
            
case 32
                break;
            
// 179
            
case -77:
                if ((
== x-5)&&(ch == 0)) {
                    
buf[j] = 195;
                    
int iii j+1;
                    for(; 
iii xiii++){
                        
buf[iii] = 196;
                    }
                    
buf[iii] = '\x0';
                    
CharToOem(filename,filename);
                    
strcat(buffilename);
                }
                if ((
== x-5)&&(ch == 1)) {
                    
                }
                break;
            default:
                if (
ch == 0) {
                    
buf[j] = 195;
                    
int i j+1;
                    for(; 
xi++){
                        
buf[i] = 196;
                    }
                    
buf[i] = '\x0';
                    
CharToOem(filename,filename);
                    
strcat(buffilename);
                } else {
                    
buf[j] = 179;
                    
int iiii j+1;
                    for(; 
iiii xiiii++){
                        
buf[iiii] = 32;
                    }
                    
buf[iiii] = '\x0';
                    
CharToOem(filename,filename);
                    
strcat(buffilename);
                }
                break;
        }
    }
}

bool tree(TCHAR *bufferint xbool chchar *tree_buf) {
    
// структура
    
WIN32_FIND_DATA f;
    
// дескриптор поиска
    
HANDLE hFind;
    
// доп массивы
    
TCHAR buf[N];
    
TCHAR buf_2[N];

    
strcpy_s(bufbuffer);
    
strcat_s(buf"/*.*");

    
hFind FindFirstFile(buf, &f);

    if (
hFind == INVALID_HANDLE_VALUE) {
        
printf_tree("ERROR");
        return 
0;
    }

    do {
        
strcpy_s(buf_2buffer);
        
strcat_s(buf_2"/");
        
strcat_s(buf_2f.cFileName);
        
// если не директория
        
if ((!(f.dwFileAttributes FILE_ATTRIBUTE_DIRECTORY))&&(!(f.dwFileAttributes FILE_ATTRIBUTE_HIDDEN))&&(ch == 1)) {
            
parser(tree_bufxf.cFileName1);
            
printf("\n");
            
printf_tree(tree_buf);
        }
        
// если директория
        
if ((f.dwFileAttributes FILE_ATTRIBUTE_DIRECTORY)&&(!(f.dwFileAttributes FILE_ATTRIBUTE_HIDDEN))&&(strcmp(f.cFileName"..") != 0) && (strcmp(f.cFileName".") != 0)) {
            
parser(tree_bufxf.cFileName0);
            
printf("\n");
            
printf_tree(tree_buf);
            
// рекурсия
            
tree(buf_25chtree_buf);
        }
    } while(
FindNextFile(hFind, &f));
    
FindClose(hFind);
    return 
1
}    

int main(int argcchar *argv[])
{
    
char tree_buf[N];
    
char root[N] = "E://";
    
int x 0;

    
strcpy(tree_bufroot);
    
CharToOem(roottree_buf);
    
printf_tree(tree_buf);

    
tree(rootx+5truetree_buf);
    
_getch();

Вложения
Тип файла: txt tree.txt (2.7 Кб, 138 просмотров)
Dodge_wow вне форума Ответить с цитированием
Старый 08.05.2012, 13:24   #2
Dodge_wow
Пользователь
 
Регистрация: 16.08.2011
Сообщений: 11
По умолчанию

В коде была отключена кодировка Юникод. использовал многобайтовую кодировку.
Dodge_wow вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Tree View (не отображается дерево) ImmortalAlexSan Общие вопросы C/C++ 1 20.05.2011 23:04
Красно-черное дерево(RB-Tree) Mixim Общие вопросы C/C++ 1 26.12.2010 16:58
Нарисовать иерархическое дерево vandrouny Общие вопросы Delphi 0 05.12.2010 16:41
[C++] дерево каталогов Akord Помощь студентам 0 17.12.2009 17:07
Дерево каталогов в табличной форме Македонский Общие вопросы Delphi 11 30.08.2007 16:47