Empty directory: Difference between revisions
m (→{{header|Java}}: before anyone asks) |
|||
Line 3: | Line 3: | ||
An empty directory contains no files nor subdirectories. With [[Unix]] or [[Windows]] systems, every directory contains an entry for “<code>.</code>” and almost every directory contains “<code>..</code>” (except for a root directory); an empty directory contains no other entries. |
An empty directory contains no files nor subdirectories. With [[Unix]] or [[Windows]] systems, every directory contains an entry for “<code>.</code>” and almost every directory contains “<code>..</code>” (except for a root directory); an empty directory contains no other entries. |
||
=={{header|C}}== |
|||
<lang c>#include <stdio.h> |
|||
#include <dirent.h> |
|||
#include <string.h> |
|||
int dir_empty(char *path) |
|||
{ |
|||
struct dirent *ent; |
|||
int ret = 1; |
|||
DIR *d = opendir(path); |
|||
if (!d) { |
|||
fprintf(stderr, "%s: ", path); |
|||
perror(""); |
|||
return -1; |
|||
} |
|||
while ((ent = readdir(d))) { |
|||
if (!strcmp(ent->d_name, ".") || !(strcmp(ent->d_name, ".."))) |
|||
continue; |
|||
ret = 0; |
|||
break; |
|||
} |
|||
closedir(d); |
|||
return ret; |
|||
} |
|||
int main(int c, char **v) |
|||
{ |
|||
int ret = 0, i; |
|||
if (c < 2) return -1; |
|||
for (i = 1; i < c; i++) { |
|||
ret = dir_empty(v[i]); |
|||
if (ret >= 0) |
|||
printf("%s: %sempty\n", v[i], ret ? "" : "not "); |
|||
} |
|||
return 0; |
|||
}</lang>Running it:<pre> |
|||
% mkdir stuff; ./a.out /usr/ ./stuff /etc/passwd |
|||
/usr/: not empty |
|||
./stuff: empty |
|||
/etc/passwd: Not a directory |
|||
</pre> |
|||
=={{header|Java}}== |
=={{header|Java}}== |
||
{{works with|Java|7+}} |
{{works with|Java|7+}} |
Revision as of 08:16, 3 January 2012
Starting with a path to some directory, determine whether the directory is empty.
An empty directory contains no files nor subdirectories. With Unix or Windows systems, every directory contains an entry for “.
” and almost every directory contains “..
” (except for a root directory); an empty directory contains no other entries.
C
<lang c>#include <stdio.h>
- include <dirent.h>
- include <string.h>
int dir_empty(char *path) { struct dirent *ent; int ret = 1;
DIR *d = opendir(path); if (!d) { fprintf(stderr, "%s: ", path); perror(""); return -1; }
while ((ent = readdir(d))) { if (!strcmp(ent->d_name, ".") || !(strcmp(ent->d_name, ".."))) continue; ret = 0; break; }
closedir(d); return ret; }
int main(int c, char **v) { int ret = 0, i; if (c < 2) return -1;
for (i = 1; i < c; i++) { ret = dir_empty(v[i]); if (ret >= 0) printf("%s: %sempty\n", v[i], ret ? "" : "not "); }
return 0;
}</lang>Running it:
% mkdir stuff; ./a.out /usr/ ./stuff /etc/passwd /usr/: not empty ./stuff: empty /etc/passwd: Not a directory
Java
This method does not check that the path given is actually a directory. If a path to a normal file is given, it will throw a NullPointerException
. File.listLess()
does not count the "." and ".." entries.
<lang java5>import java.nio.file.Paths;
//... other class code here
public static boolean isEmptyDir(String dirName){
return Paths.get(dirName).toFile().listFiles().length == 0;
}</lang>
Ruby
<lang ruby># Checks if a directory is empty, but raises SystemCallError
- if _path_ is not a directory.
def empty_dir?(path)
not Dir.foreach(path).detect {|f| f != '.' and f != '..'}
end</lang>
If Ruby is older than 1.8.7, then Dir.foreach must take a block.
<lang ruby># Checks if a directory is empty, but raises SystemCallError
- if _path_ is not a directory.
def empty_dir?(path)
Dir.foreach(path) {|f| return false if f != '.' and f != '..' } return true
end</lang>
Tcl
<lang tcl>proc isEmptyDir {dir} {
# Get list of _all_ files in directory set filenames [glob -nocomplain -tails -directory $dir * .*] # Check whether list is empty (after filtering specials) expr {![llength [lsearch -all -not -regexp $filenames {^\.\.?$}]]}
}</lang>