Обработка содержимого каталога (С)

Модератор: Модераторы разделов

Аватара пользователя
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora

Обработка содержимого каталога

Сообщение Corsair »

Есть небольшая программка, которая выводит содержимое каталога. Мне надо скрыть из вывода служебные файлы . и .. Чего может быть проще...

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <dirent.h>
//#include "SDL.h"
//#include "SDL_mixer.h"

//Mix_Music *music = NULL;

void die(char *);

int main(int argc, char *argv[]) {
    DIR * dir;
    struct dirent * ent;
    int filenumb = 1;

    if (argc != 2){
        fprintf(stderr, "Usage: %s <path>\n", argv[0]);
        exit(-1);
    }

    if(!(dir = opendir(argv[1])))  die("opendir");

    errno = 0;
    while ((ent = readdir(dir))) {
        if (ent->d_name == "." || ent->d_name == "..") continue;
        printf("%i.\t%s\n",filenumb,ent->d_name);
        filenumb++;
        errno = 0;
    }
    if(errno) die("readdir");
    closedir(dir);
}

void die(char * message){
    perror(message);
    exit(1);
}


Но не тут то было.
Корень зла вот эта строка: if (ent->d_name == "." || ent->d_name == "..") continue;
Я, как человек, сильно испорченный PHP, не понимаю почему на С это условие не выполняется. При чем эти файлы в выводе присутствуют.
Буду признателен за помощь.
Жестокий стоячий админ (с) коллега
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Обработка содержимого каталога

Сообщение BlackStar »

В "C" нет типа "строка", используй strcmp().
LightLang Team
Спасибо сказали:
Аватара пользователя
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora

Re: Обработка содержимого каталога

Сообщение Corsair »

BlackStar, благодарствую, все получилось.
Жестокий стоячий админ (с) коллега
Спасибо сказали:
Аватара пользователя
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora

Re: Обработка содержимого каталога

Сообщение Corsair »

В гробу я видел этот С. Не думал что все настолько неудобно. Переписал все на С++ - небо и земля. Только сейчас понял сколько разработчиков принесли себя в жертву UNIX.

Код: Выделить всё

#include <dirent.h>
#include <vector>
#include <string>
#include <iostream>

using namespace std;

void die (string message){
    cerr << message <<endl;
    exit(-1);
}

int getdircontents (string dir, vector<string> &files){
    DIR *dp;
    struct dirent *entp;
    if((dp  = opendir(dir.c_str())) == NULL) die("opendir() error");

    while ((entp = readdir(dp)) != NULL) {
    if (string(entp->d_name) == "." || string(entp->d_name) == "..") continue;
        files.push_back(string(entp->d_name));
    }
    closedir(dp);
    return 0;
}

int main(int argc, char **argv){
    if (argc != 2) die("Usage: " + string(argv[0]) + " <path>");
    string dir = string(argv[1]);
    vector<string> files = vector<string>();

    getdircontents(dir,files);

    for (int i = 0;i < files.size();i++)
        cout << i+1 << "\t" << files[i] << endl;

    return 0;
}
Жестокий стоячий админ (с) коллега
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Обработка содержимого каталога

Сообщение BlackStar »

Да ну, на С код более простой и понятный. А если хочется изящества:

Код: Выделить всё

#!/usr/bin/env python

import sys
import os

def visit(arg, root, fnames):
    for name in fnames:
        print name

os.path.walk(sys.argv[1], visit, None)

код на питоне, делает тоже самое.
LightLang Team
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Обработка содержимого каталога

Сообщение serzh-z »

Corsair писал(а):
10.04.2008 11:56
Только сейчас понял сколько разработчиков принесли себя в жертву UNIX.
Можно подумать, что std::string сам собою образовался и является чем-то другим, нежели написанной автором STL обёрткой вокруг тех же байтовых массивов. -)
Спасибо сказали:
Аватара пользователя
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora

Re: Обработка содержимого каталога

Сообщение Corsair »

BlackStar, к сожалению учить сейчас абсалютно новые для меня языки нет времени, да, признаться, и желания.
serzh-z, да я это все прекрасно понимаю, просто я слишком ленив. И уж конечно проникся большим уважением к тем людям, которые создали все эти "вкусности" для таких как я=)
Жестокий стоячий админ (с) коллега
Спасибо сказали: