перечисление файлов в каталоге и удаление их на C / C

#c #linux

#c #linux

Вопрос:

В коде «C» я хотел бы перечислить все файлы в каталоге и удалить самый старый. Как мне это сделать?

Могу ли я использовать popen для этого или у нас есть какие-либо другие решения??

Спасибо,

Комментарии:

1. Обычный C не имеет никакого понятия о каталогах, поэтому вам нужно будет указать, для какой ОС вы хотите это сделать.

2. @caf: на самом деле обычный C (который, похоже, подразумевает сам язык программирования) даже не имеет понятия о файлах или о чем-либо еще, если уж на то пошло. C состоит примерно из 32 ключевых слов, нескольких операторов и все. Все эти понятия файлов, каталогов и т.д. Определены в библиотеках. Итак, если вы не имели в виду само определение языка, тогда вопрос в том, определены ли каталоги в стандартных библиотеках C? и ответ — ДА .. В частности, концепция каталогов интерфейса dirent.h для ОС является стандартом как X.Open, так и POSIX.1.

3. @AhmedMasud: Существует стандартная библиотека C, которая указана как часть самого языка программирования: например, должна предоставляться соответствующая размещенная реализация C fopen() . dirent.h Интерфейс, с другой стороны, не является частью стандарта C.

Ответ №1:

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

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

DIR* dp;
struct dirent* ep;
char* path = "/home/mydir";

dp = opendir(path);
if (dp != NULL)
{
  printf("Dir content:n");
  while(ep = readdir(dp))
  {
    printf("%sn", ep->d_name);
  }
}
closedir(dp);
  

Чтобы проверить время создания файла или модификации, используйте stat (man 2 stat). Для удаления файла просто используйте функцию remove(const char* path)

Комментарии:

1. Я не совсем уверен, что безопасно удалять файл из открытого каталога (потому что сканируемый каталог обновляется во время сканирования). Я бы предложил сделать это в два прохода: первый — сканирование и поиск файлов для удаления, второй — их удаление.

2. Это очень хорошее замечание. Однако в этом случае вам все равно придется завершить сканирование перед удалением, поскольку операционная система хочет удалить самый старый файл (вы должны проверить все файлы, чтобы найти самый старый).

Ответ №2:

В Linux (и, действительно, в любой системе POSIX) вы считываете каталог, вызывая opendir() / readdir() / closedir() . Затем вы можете вызвать stat() для каждой записи каталога, чтобы определить, является ли это файлом, и каково время доступа к нему / модификации / изменения статуса.

Если ваше определение «самого старого» зависит от времени создания файла, то вы находитесь на шаткой почве — традиционно UNIX не регистрировала время создания. В Linux некоторые новейшие файловые системы предоставляют это через расширенный атрибут file.crtime (к которому вы получаете доступ с помощью getxattr() из sys/xattr.h ), но вам придется обрабатывать обычный случай, когда этот атрибут не существует.

Ответ №3:

Вы можете просканировать каталог с помощью readdir и opendir или, если вы хотите пройти (рекурсивно) файловую иерархию fts или nftw. Не забудьте игнорировать записи для текущего каталога "." и родительского ".." . Вероятно, вы тоже захотите использовать системный вызов stat.

Комментарии:

1. Вы не можете использовать readdir() без opendir() — одно не соответствует другому.