Форум программистов, компьютерный форум CyberForum.ru

С++ под Linux

Войти
Регистрация
Восстановить пароль
 
VIJIS
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 34
#1

Вывести из каталога файлы, доступные для чтения и записи - C++ Linux

08.11.2016, 13:13. Просмотров 513. Ответов 6
Метки нет (Все метки)

Нашёл на форуме прогу, выводящую все файлы и каталога. Нужно организовать ещё следующее. Как задавать каталог при запуске проги? То есть как сделать в Linux поток ввода. И как вывести только те файлы, которые доступны для чтения и исполнения? через bash делал это через find -type f -perm -100. Нужно что-то аналогичное
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <dirent.h> 
#define DIRNAME "."
#define OFNAME  "out.log"
 
int main(void)
{
    FILE *ofp;
    DIR *dp;
    struct dirent *dent;
 
    if( (dp = opendir(DIRNAME)) == NULL) {
        fprintf(stderr, "opendir: %s: %s\n", DIRNAME, strerror(errno));
        return 1;
    }
    if( (ofp = fopen(OFNAME, "w")) == NULL) {
        fprintf(stderr, "fopen: %s: %s\n", OFNAME, strerror(errno));
        return 1;
    }
 
    while(dent = readdir(dp))
        if(strcmp(".", dent->d_name) && strcmp("..", dent->d_name))
            fprintf(ofp, "%s\n", dent->d_name);
    closedir(dp);
    fclose(ofp);
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2016, 13:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывести из каталога файлы, доступные для чтения и записи (C++ Linux):

Создать две программы для записи информации в FIFO и чтения из нее - C++ Linux
/* Программа 05-4.с, осуществляющая однонаправленную связь через FIFO между процессом-родителем и процессом-ребенком */ #include...

Как заблокировать файл на время чтения/записи? - C++
Как сделать такое? Чтоб другие программы не могли в этот момент писать в этот файл?

В учетной записи с группой Пользователи файлы открываются "только для чтения" - Администрирование Windows
Добрый день всем! Создал учетную запись с гуппой Пользователи для повышения безопасности, т.к. совсем еще не давно лечил комп при помощи...

Вывести список и общий размер файлов с атрибутом «Только для чтения» и заархивировать эти файлы - PowerShell
Добрый день. Подскажите пожалуйста, имею такое задание: Вывести список и общий размер файлов с атрибутом «Только для чтения», имеющихся в...

Написать функции для чтения/записи отдельных бит для любой записи из данного набора - C++
Начиная с адреса А в памяти МК находятся N записей длиной k бит каждая. Записи выровнены по границе слова. Написать функции для...

С помощью функции readdir () и is_writable () выделить из каталога файлы, имеющие возможность записи - PHP
Необходимо с помощью функции readdir() и is_writable() выделить из каталога файлы, имеющие возможность записи. Но программа выводит только...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nimazzzy
Заблокирован
08.11.2016, 13:30 #2
Каталог проще всего передать параметром в программу. Взять потом из argv[1].
Для проверки доступа можно использовать функцию access. Читать тут: https://linux.die.net/man/2/access
VIJIS
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 34
08.11.2016, 17:40  [ТС] #3
nimazzzy, А как параметром передавать?
nimazzzy
Заблокирован
08.11.2016, 17:47 #4
При заупске программы в командной строке можно передавать параметры. Они потом рантаймом передаются в main двумя параметрами - кол-во аргументов командной строки и сами аргументы.
VIJIS
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 34
08.11.2016, 19:27  [ТС] #5
nimazzzy, как задать access для каждого файла каталога в цикле?
nimazzzy
Заблокирован
08.11.2016, 22:16 #6
В твоей программе есть получение имени файла. Как раз, каждый файл из директории перебирается в цикле. Добавь туда вызов access с путем до найденного файла.
VIJIS
0 / 0 / 0
Регистрация: 26.10.2015
Сообщений: 34
14.11.2016, 22:52  [ТС] #7
nimazzzy, Не получается вставить access туда. Кароче написал вот так. Тут же на форму нашёл и вот это работало. Что не так с кодом? Компилируется но выдаёт в терминале несколько раз
stat(): Bad address
И ещё компиляция идёт с ошибкой в строке с циклом while. Пишет warning: suggest parentheses around assignment used as truth value [-Wparentheses]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <string.h>
 
#define DIRNAME "/home/vladislav/os/lab5/script4"
#define OFNAME  "out.log"
 
int main()
{
    FILE* ofp;
    DIR* dp;
    struct dirent* dent;
    struct stat* sb;
    if( (dp = opendir(DIRNAME)) == NULL) {
        fprintf(stderr, "Каталога не существует %s: %s\n", DIRNAME,strerror(errno));
        return 1;
    }
    if( (ofp = fopen(OFNAME, "w")) == NULL) {
        fprintf(stderr, "Файла не существует %s: %s\n", OFNAME,strerror(errno));
        return 1;
    }
    char path[256];
    int fr; 
    while (dent = readdir(dp)){
        strcpy(path,DIRNAME);
        strcat(path,"/");
        strcat(path, dent->d_name);
        memset(&sb, 0, sizeof(sb));
        fr = stat(path,sb);
        if (fr != 0) {
            perror("stat()");
            continue;
        }
    if (!(sb->st_mode & (S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)))
            fprintf(ofp, "%s\n", path);
    }   
    closedir(dp);
    fclose(ofp);
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2016, 22:52
Привет! Вот еще темы с ответами:

Вывести скрытые файлы каталога на экран - Assembler
День добрый, товарищи программисты. Нужна программа которая выводит сообщение о наличии скрытых файлов в каталоге. Начал писать...

Как вывести все файлы из каталога? - PHP
Как вывести все файлы из папки? $username = $_SESSION; $dir = &quot;uploads/$username/&quot;; // директория, в папке есть файлы $files =...

Как вывести файлы каталога через for? - Bash
Помогите пожалуйста написать скрипт, который: выводит список файлов, расположенных в текущем каталоге, не используя команду ls.Нужно...

Ошибка: не могу открыть (x86) \ FreeBASIC \ Bin \ win32 \ as.exe для чтения: Нет такого файла или каталога - Basic
Ассемблер сообщения: Ошибка: не могу открыть файлы для чтения: Нет такого файла или каталога Файлы: Ошибка: не могу открыть (x86) \...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.11.2016, 22:52
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru