0

您好,我想读取和写入目录,就像读取和写入文件一样。我总是使用openread和函数writeclose这意味着我使用描述符。但是在目录上执行此操作不起作用,open调用有效,但read返回 -1 并且errno是 EISDIR。我是否被迫使用流来读取目录?

4

2 回答 2

2

read()系统write()调用不能用于目录。相反,getdents()/getdents64()系统调用用于读取目录。目录根本不能直接写入。

此外,glibc 没有为getdents()/getdents64()系统调用提供包装器 - 相反,它提供了符合 POSIX 的readdir()函数,该函数是使用这些系统调用实现的。大多数程序应该使用readdir(),但可以直接使用 调用系统调用syscall()

于 2013-06-16T10:02:38.393 回答
0

我在 Stack Overflow 中找到了这段代码(How can I get the list of files in a directory using C or C++?),这对我理解它的工作原理有很大帮助:

#include <dirent.h>
#include <stdio.h>
#include <string.h>

int main(){
    DIR* dirFile = opendir( "." );
    struct dirent* hFile;
    if ( dirFile ) 
    {
    while (( hFile = readdir( dirFile )) != NULL ) 
    {
       if ( !strcmp( hFile->d_name, "."  )) continue;
       if ( !strcmp( hFile->d_name, ".." )) continue;

     // in linux hidden files all start with '.'
       if ( gIgnoreHidden && ( hFile->d_name[0] == '.' )) continue;

     // dirFile.name is the name of the file. Do whatever string comparison 
     // you want here. Something like:
        if ( strstr( hFile->d_name, ".c" ))
           printf( "found an .txt file: %s", hFile->d_name );
    } 
  closedir( dirFile );
 }
}
于 2013-06-16T09:41:59.393 回答