Как игнорировать скрытые файлы с opendir и readdir в библиотеке C - PullRequest
5 голосов
/ 10 мая 2009

Вот простой код:

DIR* pd = opendir(xxxx);
struct dirent *cur;
while (cur = readdir(pd)) puts(cur->d_name);

То, что я получаю, немного запутанно: в том числе точка (.), точка-точка (..) и имена файлов, заканчивающиеся на ~.

Я хочу сделать то же самое, что и команда ls. Как мне это исправить, пожалуйста?

Ответы [ 4 ]

16 голосов
/ 10 мая 2009

Это нормально. Если вы сделаете ls -a (который показывает все файлы, ls -A покажет все файлы, кроме . и ..), вы увидите тот же вывод.

. - это ссылка на каталог, в котором она находится: foo/bar/. - это то же самое, что foo/bar.

.. - это ссылка на родительский каталог каталога, в котором он находится: foo/bar/.. - это то же самое, что и foo.

Любые другие файлы, начинающиеся с ., являются скрытыми файлами (по соглашению, в действительности это ничем не обеспечивается; это отличается от Windows, где существует настоящий, официальный скрытый атрибут). Файлы, заканчивающиеся ~, вероятно, являются файлами резервных копий, созданными вашим текстовым редактором (опять же, это соглашение, на самом деле может быть чем угодно).

Если вы не хотите показывать файлы такого типа, вы должны явно проверить их и игнорировать.

6 голосов
/ 10 мая 2009

Удаление скрытых файлов:

DIR* pd = opendir(xxxx);
struct dirent *cur;
while (cur = readdir(pd)) {
    if (cur->d_name[0] != '.') {
        puts(cur->d_name);
    }
}

Удаление скрытых файлов и файлов, оканчивающихся на "~":

DIR* pd = opendir(xxxx);
struct dirent *cur;
while (cur = readdir(pd)) {
    if (cur->d_name[0] != '.' && cur->d_name[strlen(cur->d_name)-1] != '~') {
        puts(cur->d_name);
    }
}
2 голосов
/ 10 мая 2009

Вставьте if (cur->d_name[0] != '.') перед обработкой имени.

Стандарт скрытых файлов UNIX - это начальная точка, которой также соответствуют . и ...

Трейлинг ~ является стандартом для файлов резервных копий. Проигнорировать это немного больше, но многогигагерцевый процессор может справиться с этим. Используйте что-то вроде if (cur->d_name[strlen(cur->d_name)-1] == '~')

1 голос
/ 10 мая 2009

Это поведение точно , как и ls -a. Если вы хотите фильтрации, то вам нужно будет сделать это после факта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...