source: trunk/third/glib2/glib/gdir.c @ 18159

Revision 18159, 3.4 KB checked in by ghudson, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18158, which included commits to RCS files with non-trunk default branches.
Line 
1/* GLIB - Library of useful routines for C programming
2 * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
3 *
4 * gdir.c: Simplified wrapper around the DIRENT functions.
5 *
6 * Copyright 2001 Hans Breuer
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
22 */
23
24#include "config.h"
25
26#include <errno.h>
27#include <string.h> /* strcmp */
28
29#ifdef HAVE_DIRENT_H
30#include <sys/types.h>
31#include <dirent.h>
32#endif
33
34#include "glib.h"
35#include "gdir.h"
36
37#include "glibintl.h"
38
39struct _GDir
40{
41  DIR *dir;
42};
43
44/**
45 * g_dir_open:
46 * @path: the path to the directory you are interested in
47 * @flags: Currently must be set to 0. Reserved for future use.
48 * @error: return location for a #GError, or %NULL.
49 *         If non-%NULL, an error will be set if and only if
50 *         g_dir_open_fails.
51 *
52 * Opens a directory for reading. The names of the files
53 * in the directory can then be retrieved using
54 * g_dir_read_name().
55 *
56 * Return value: a newly allocated #GDir on success, %NULL on failure.
57 *   If non-%NULL, you must free the result with g_dir_close()
58 *   when you are finished with it.
59 **/
60GDir *
61g_dir_open (const gchar  *path,
62            guint         flags,
63            GError      **error)
64{
65  GDir *dir;
66
67  g_return_val_if_fail (path != NULL, NULL);
68
69  dir = g_new (GDir, 1);
70
71  dir->dir = opendir (path);
72
73  if (dir->dir)
74    return dir;
75
76  /* error case */
77  g_set_error (error,
78               G_FILE_ERROR,
79               g_file_error_from_errno (errno),
80               _("Error opening directory '%s': %s"),
81               path, g_strerror (errno));
82
83  g_free (dir);
84  return NULL;
85}
86
87/**
88 * g_dir_read_name:
89 * @dir: a #GDir* created by g_dir_open()
90 *
91 * Retrieves the name of the next entry in the directory.
92 * The '.' and '..' entries are omitted.
93 *
94 * Return value: The entries name or %NULL if there are no
95 *   more entries. The return value is owned by GLib and
96 *   must not be modified or freed.
97 **/
98G_CONST_RETURN gchar*
99g_dir_read_name (GDir *dir)
100{
101  struct dirent *entry;
102
103  g_return_val_if_fail (dir != NULL, NULL);
104
105  entry = readdir (dir->dir);
106  while (entry
107         && (0 == strcmp (entry->d_name, ".") ||
108             0 == strcmp (entry->d_name, "..")))
109    entry = readdir (dir->dir);
110
111  if (entry)
112    return entry->d_name;
113  else
114    return NULL;
115}
116
117/**
118 * g_dir_rewind:
119 * @dir: a #GDir* created by g_dir_open()
120 *
121 * Resets the given directory. The next call to g_dir_read_name()
122 * will return the first entry again.
123 **/
124void
125g_dir_rewind (GDir *dir)
126{
127  g_return_if_fail (dir != NULL);
128 
129  rewinddir (dir->dir);
130}
131
132/**
133 * g_dir_close:
134 * @dir: a #GDir* created by g_dir_open()
135 *
136 * Closes the directory and deallocates all related resources.
137 **/
138void
139g_dir_close (GDir *dir)
140{
141  g_return_if_fail (dir != NULL);
142
143  closedir (dir->dir);
144  g_free (dir);
145}
Note: See TracBrowser for help on using the repository browser.