#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()
— одно не соответствует другому.