Разработать программу, которая осуществляет просмотр текущего каталога и выводит на экран его содержимое группами в порядке возрастания числа ссылок на файлы (в том числе имена каталогов). Группа представляет собой объединение файлов с одинаковым числом ссылок на них.

Решение:

*/

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

// #include <fcntl.h> /* флажки чтения и записи */

#include <sys/types.h> /* определения типов */

#include <sys/stat.h> /* структура, возвращаемая stat */

#include <dirent.h>

 

struct LE{

int hardlinks;

char name[256];

struct LE *next;

};

 

main(int argc, char **argv)

{

struct stat stat_buf;

struct dirent *d;

DIR *dir;

struct LE *head, *cur, *i, *j, tmp;

 

if (argc == 1)

{

printf(“Usage: %s <dir_name>\n”, argv[0]);

exit(-1);

}

if ((dir = opendir(argv[1])) == NULL   )

{

printf(“Couldn’t open %s\n”, argv[1]);

exit(-1);

}

 

head = malloc(sizeof(struct LE));

cur = head;

while ((d = readdir(dir)) != NULL)

{

strcpy(cur->name, d->d_name);

cur->hardlinks = 1;

if (stat(cur->name, &stat_buf) == -1)

{

printf(“Couldn’t stat %s\n”, cur->name);

exit(-1);

}

cur->hardlinks = stat_buf.st_nlink;

cur->next = malloc(sizeof(struct LE));

cur = cur->next;

}

cur->next = NULL;

 

//let’s sort ’em all!

for (i = head; i->next != NULL; i = i->next)

for (j = head; j->next != NULL; j = j->next)

if (i->hardlinks < j->hardlinks)

{

tmp.hardlinks = j->hardlinks;

strcpy(tmp.name, j->name);

j->hardlinks = i->hardlinks;

strcpy(j->name, i->name);

i->hardlinks = tmp.hardlinks;

strcpy(i->name, tmp.name);

}

for (cur = head; cur->next != NULL; cur = cur->next)

printf(“%s : %d\n”, cur->name, cur->hardlinks);

 

closedir(dir);

for (cur = head; cur != NULL; cur = cur->next)

free(cur);

return 0;

}

END OF FILE

 

Задача 1

Разработать программу, которая просматривает текущий каталог и выводит на экран имена всех встретившихся в нем обычных файлов. Затем осуществляется переход в родительский каталог, который затем становится текущим, и указанные выше действия повторяются до тех пор, пока текущим каталогом не станет корневой каталог

 

Решение

*/

 

#include <sys/types.h>

#include <dirent.h>

#include <unistd.h>

#include <sys/stat.h>

#include <stdio.h>

 

int main(int argc, char *argv[])

{

if (argc > 1)

printf(“Usage: %s – Additional argument(s) will be ignored\n”, argv[0]);

 

DIR *d;

struct dirent *entry;

struct stat file;

char current[PATH_MAX];

while (1) {

printf(“Working directory: %s\n”, get_current_dir_name());

d = opendir(“.”);

while ((entry = readdir(d)) != NULL )

{

stat(entry->d_name, &file);

if ((file.st_mode & S_IFMT) == S_IFREG)

printf(“\t%s\n”, entry->d_name);

}

closedir(d);

chdir(“..”);

if ( ! strcmp(get_current_dir_name(),”/”))

break;

}

return 0;

}END OF FILE

Доступа нет, контент закрыт

Доступа нет, контент закрыт

Доступа нет, контент закрыт

Был ли этот материал полезен для Вас?

Комментирование закрыто.