Работа с файловой системой (ext3, C++)

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

Аватара пользователя
Илуватар
Сообщения: 295
Статус: Antic1tizen 0ne
ОС: Debian Wheezy/Sid amd64

Работа с файловой системой

Сообщение Илуватар »

Решил я создать одну хитрую программку. В виндовозе и на паскале всё проходило на ура с помощью всяческих record'ов типа "папка" и функций aka findFirst(), FindClose() и т.д. Но тут-то совсем другая тема!
Так что - скажите пожалуйста, как например, в массив, ну скажем, строк, записать все имена файлов и папок в заданной директории?
Это должно выглядеть примерно так:
....................
int count;
count = ?Число_Элементов(<папка>)?;
string *subdir = new string[count];
subdir=?Фуншон_для_вывода_элементов(...)?;
....................

Либо через цикл. И вопрос в том, как получить это самое число элементов и запихнуть их в массив
† Obiit animus, natus est atomus †
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Работа с файловой системой

Сообщение elide »

ну а просто смонтировать эту фс куда-нибудь, и просто обходить рекурсивно?
слава роботам!
Спасибо сказали:
Аватара пользователя
aLexx programmer
Сообщения: 985
Статус: Турук-Макто
ОС: Gentoo -> Ubuntu

Re: Работа с файловой системой

Сообщение aLexx programmer »

(D3K@nT0R1S @ Aug 14 2006, в 06:09) писал(а):Так что - скажите пожалуйста, как например, в массив, ну скажем, строк, записать все имена файлов и папок в заданной директории?

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

Re: Работа с файловой системой

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

Надо полагать, что и сишные функции подойдут - readdir, scandir.
Спасибо сказали:
Аватара пользователя
Илуватар
Сообщения: 295
Статус: Antic1tizen 0ne
ОС: Debian Wheezy/Sid amd64

Re: Работа с файловой системой

Сообщение Илуватар »

ну а просто смонтировать эту фс куда-нибудь, и просто обходить рекурсивно?

Я и хочу так сделать. Рекурсивы рулят! :P

З.Ы. Обожди-ка, в принципе отдельно про монтирование и обход понятно, а вместе ниасилил...можно поподробнее?
Может, просто использовать ls?

А может, ещё не на Си, а в шеллах писать? :)
Надо полагать, что и сишные функции подойдут - readdir, scandir.

Ща попробую, спасибо. Будь ты на ЕГ, накинул бы тебе егопку :clap3:
† Obiit animus, natus est atomus †
Спасибо сказали:
Аватара пользователя
Илуватар
Сообщения: 295
Статус: Antic1tizen 0ne
ОС: Debian Wheezy/Sid amd64

Re: Работа с файловой системой

Сообщение Илуватар »

Ччёрт!! Пишет то же самое, типа "segmentation fault", то есть пытается рассмотреть ext3 как блочный девайс. Млин. Ладно, попробую по see also чего-нить доискаться...

ADD

Кажется, доискался...

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

#include <stddef.h>
     #include <stdio.h>
     #include <sys/types.h>
     #include <dirent.h>

     int
     main (void)
     {
       DIR *dp;
       struct dirent *ep;

       dp = opendir ("./");
       if (dp != NULL)
         {
           while (ep = readdir (dp))
             puts (ep->d_name);
           (void) closedir (dp);
         }
       else
         perror ("Couldn't open the directory");

       return 0;
     }


Хорошая вещь OpenSource! Как только сделаю нормальный релиз, вышлю исходники. А что это за прога - пока тайна. Не хочу пускать слова на ветер.
† Obiit animus, natus est atomus †
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Работа с файловой системой

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

Гм... причем тут блочный девайс... :wacko:
Спасибо сказали:
Аватара пользователя
Илуватар
Сообщения: 295
Статус: Antic1tizen 0ne
ОС: Debian Wheezy/Sid amd64

Re: Работа с файловой системой

Сообщение Илуватар »

Всё равно...:( при получении атрибутов файла (фуншон stat) говорит Segmentation Fault. Вопрос - как определить, файл попался или папка?
† Obiit animus, natus est atomus †
Спасибо сказали:
Аватара пользователя
GRS
Сообщения: 236
Статус: C++ Pro
ОС: Suse10.2/XP

Re: Работа с файловой системой

Сообщение GRS »

D3K@nT0R1S
Вопрос - как определить, файл попался или папка?

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

char * filename = <имя файла>;
struct stat finfo;
lstat(filename, &finfo);

if (S_ISREG(s.st_mode))
    cout<<"It's common file."<<endl;
if (S_ISDIR(s.st_mode))
    cout<<"It's folder."<<endl;
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: Работа с файловой системой

Сообщение Red User »

D3K@nT0R1S

Вообще-то readdir возвращает структуру, в которой есть поле d_type.
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
Аватара пользователя
Илуватар
Сообщения: 295
Статус: Antic1tizen 0ne
ОС: Debian Wheezy/Sid amd64

Re: Работа с файловой системой

Сообщение Илуватар »

2 GRS лстат пробовал уже, он ведь собсно и выдаёт данные о файле..., да, сама процедура проходит, а вот макросы напрочь отказываются работать...
2 Red User ща гляну, спс.
† Obiit animus, natus est atomus †
Спасибо сказали:
Аватара пользователя
GRS
Сообщения: 236
Статус: C++ Pro
ОС: Suse10.2/XP

Re: Работа с файловой системой

Сообщение GRS »

D3K@nT0R1S
Значит как-то криво делаешь. Проверь параметры, путь к файлу и возвращаемое функцией lstat значение.
Спасибо сказали:
Аватара пользователя
Илуватар
Сообщения: 295
Статус: Antic1tizen 0ne
ОС: Debian Wheezy/Sid amd64

Re: Работа с файловой системой

Сообщение Илуватар »

Значит как-то криво делаешь. Проверь параметры, путь к файлу и возвращаемое функцией lstat значение.

Похоже, уже не надо...руки дошли проверить четвёртый пост в этой теме...
Ммм...вот:

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

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>

static int dir(const struct dirent * eps)
{
if(eps->d_type == 4 )
   return 1;
return 0;
}

int main (int argc,char *argv[])
{
struct dirent ** eps;
int n;
int i;

n = scandir("./",&eps,dir,alphasort);

if(n > 0){
   for(i = 0;i < n;i++){
     printf("\n name >> %s",eps[i]->d_name);
   }
}
else{
   printf("not dir");
}
return 0;
}

З.Ы. (с) не мой
З.З.Ы. Кажись, допёр, наконец...d_type=4 - это папка?
† Obiit animus, natus est atomus †
Спасибо сказали: