scandir, scandirat, alphasort, versionsort — scan a directory for matching entries
#include <dirent.h>
int
scandir( |
const char *dirp, |
struct dirent ***namelist, | |
int (*filter)( const struct
dirent *) , |
|
int (*compar)( const struct
dirent **, const struct dirent
**) ) ; |
int
alphasort( |
const struct dirent **a, |
const struct dirent **b) ; |
int
versionsort( |
const struct dirent **a, |
const struct dirent **b) ; |
#include <fcntl.h> /* Definition of AT_* constants */ #include <dirent.h>
int
scandirat( |
int dirfd, |
const char *dirp, | |
struct dirent ***namelist, | |
int (*filter)( const struct
dirent *) , |
|
int (*compar)( const struct
dirent **, const struct dirent
**) ) ; |
Note | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
The scandir
() function scans
the directory dirp
,
calling filter
() on each
directory entry. Entries for which filter
() returns nonzero are stored in
strings allocated via malloc(3), sorted using
qsort(3) with the
comparison function compar
(),
and collected in array namelist
which is allocated via
malloc(3). If filter
is NULL, all entries are
selected.
The alphasort
() and
versionsort
() functions can be
used as the comparison function compar
(). The former sorts
directory entries using strcoll(3), the latter
using strverscmp(3) on the
strings (*a)−>d_name
and
(*b)−>d_name
.
The scandirat
() function
operates in exactly the same way as scandir
(), except for the differences
described here.
If the pathname given in dirp
is relative, then it is
interpreted relative to the directory referred to by the
file descriptor dirfd
(rather than relative
to the current working directory of the calling process, as
is done by scandir
() for a
relative pathname).
If dirp
is
relative and dirfd
is the special value AT_FDCWD
, then dirp
is interpreted relative
to the current working directory of the calling process
(like scandir
()).
If dirp
is
absolute, then dirfd
is ignored.
See openat(2) for an
explanation of the need for scandirat
().
The scandir
() function
returns the number of directory entries selected. On error,
−1 is returned, with errno
set to indicate the cause of the error.
The alphasort
() and
versionsort
() functions return
an integer less than, equal to, or greater than zero if the
first argument is considered to be respectively less than,
equal to, or greater than the second.
The path in dirp
does not exist.
Insufficient memory to complete the operation.
The path in dirp
is not a
directory.
The following additional errors can occur for scandirat
():
dirfd
is not
a valid file descriptor.
dirp
is a
relative path and dirfd
is a file
descriptor referring to a file other than a
directory.
versionsort
() was added to
glibc in version 2.1.
scandirat
() was added to
glibc in version 2.15.
For an explanation of the terms used in this section, see attributes(7).
Interface | Attribute | Value |
scandir (), scandirat () |
Thread safety | MT-Safe |
alphasort (), versionsort () |
Thread safety | MT-Safe locale |
alphasort
(), scandir
(): 4.3BSD, POSIX.1-2008.
versionsort
() and
scandirat
() are GNU
extensions.
Since glibc 2.1, alphasort
()
calls strcoll(3); earlier it used
strcmp(3).
Before glibc 2.10, the two arguments of alphasort
() and versionsort
() were typed as const void *. When alphasort
() was standardized in
POSIX.1-2008, the argument type was specified as the
type-safe const struct dirent **,
and glibc 2.10 changed the definition of alphasort
() (and the nonstandard
versionsort
()) to match the
standard.
#define _DEFAULT_SOURCE /* print files in current directory in reverse order */ #include <dirent.h> int main(void) { struct dirent **namelist; int n; n = scandir(".", &namelist, NULL, alphasort); if (n < 0) perror("scandir"); else { while (n−−) { printf("%s\n", namelist[n]−>d_name); free(namelist[n]); } free(namelist); } }
closedir(3), fnmatch(3), opendir(3), readdir(3), rewinddir(3), seekdir(3), strcmp(3), strcoll(3), strverscmp(3), telldir(3)
This page is part of release 4.07 of the Linux man-pages
project. A
description of the project, information about reporting bugs,
and the latest version of this page, can be found at
https://www.kernel.org/doc/man−pages/.
Copyright (C) 1993 David Metcalfe (davidprism.demon.co.uk) %%%LICENSE_START(VERBATIM) Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Since the Linux kernel and libraries are constantly changing, this manual page may be incorrect or out-of-date. The author(s) assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein. The author(s) may not have taken the same level of care in the production of this manual, which is licensed free of charge, as they might when working professionally. Formatted or processed versions of this manual, if unaccompanied by the source, must acknowledge the copyright and authors of this work. %%%LICENSE_END References consulted: Linux libc source code Lewine's _POSIX Programmer's Guide_ (O'Reilly & Associates, 1991) 386BSD man pages Modified Sat Jul 24 18:26:16 1993 by Rik Faith (faithcs.unc.edu) Modified Thu Apr 11 17:11:33 1996 by Andries Brouwer (aebcwi.nl): Corrected type of compar routines, as suggested by Miguel Barreiro (enanoavalon.yaix.es). Added example. Modified Sun Sep 24 20:15:46 2000 by aeb, following Petter Reinholdtsen. Modified 2001-12-26 by aeb, following Joey. Added versionsort. The pieces on scandirat(3) were copyright and licensed as follows. Copyright (c) 2012, Mark R. Bannister <cambridgeusers.sourceforge.net> based on text in mkfifoat.3 Copyright (c) 2006, Michael Kerrisk %%%LICENSE_START(GPLv2+_DOC_FULL) This is free documentation; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU General Public License's references to "object code" and "executables" are to be interpreted as the output of any document formatting or typesetting system, including intermediate and printed output. This manual is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this manual; if not, see <http://www.gnu.org/licenses/>. %%%LICENSE_END |