读取所选目录中的txt文件

时间:2016-12-20 14:27:22

标签: c

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

int main (void)
{
  DIR *dp;
  struct dirent *ep;     
  dp = opendir ("./");

  if (dp != NULL)
  {
    while (ep = readdir (dp))
      puts (ep->d_name);

    (void) closedir (dp);
  }
  else
    perror ("Couldn't open the directory");

  return 0;
}

此代码为我提供了该目录中的所有内容。它像“ls”命令一样工作。例如,假设我有一个文件夹,名称是“文件夹”,一个.txt文件,名称是“输入”(名称可能是不同的btw),在该目录中。我想决定它是文件夹还是txt文件。如果是txt文件我该怎么读呢?

2 个答案:

答案 0 :(得分:1)

]您可以使用scandir()功能打开并扫描目录中的条目。

该示例来自man 3 scandir

#define _SVID_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);
    }
}

请注意struct dirent

struct dirent {
    ino_t          d_ino;       /* inode number */
    off_t          d_off;       /* offset to the next dirent */
    unsigned short d_reclen;    /* length of this record */
    unsigned char  d_type;      /* type of file; not supported
                               by all file system types */
    char           d_name[256]; /* filename */
};

您可以d_type字段检查当前条目是常规文件,目录还是其他文件。

可用的文件类型是:

#define DT_UNKNOWN       0
#define DT_FIFO          1
#define DT_CHR           2
#define DT_DIR           4   // directory type
#define DT_BLK           6
#define DT_REG           8   // regular file, txt file is a regular file
#define DT_LNK          10
#define DT_SOCK         12
#define DT_WHT          14

检查文件的名称和类型后,您可以使用open()(系统调用)或fopen()(glib函数)安全地打开它,并按read()读取内容(如果您通过open()或fread()(fopen()对应方式)打开文件。

阅读后不要忘记关闭文件。

此外,如果您只是想检查目录的存在性和可访问性,那么access()就可以处理了。

下面的代码测试目录是否存在。

int exist_dir (const char *dir)
{
    DIR *dirptr;

    if (access(dir, F_OK) != -1) {
        // file exists
        if ((dirptr = opendir(dir)) != NULL) {
            // do something here
            closedir (dirptr);
        } else {
            // dir exists, but not a directory
            return -1;
        }
    } else {
        // dir does not exist
        return -1; 
    }

    return 0;
}

答案 1 :(得分:1)

可以通过调用函数stat获取有关除内容之外的文件的所有信息。 stat有签名

int stat(const char *pathname, struct stat *buf);

并返回buf指向的缓冲区中的文件信息。

struct stat在字段st_mode中对文件类型和文件权限的信息进行编码。

定义了一些额外的宏来测试文件类型:

  

S_ISREG(m)是常规文件吗?

     

S_ISDIR(m)目录?

     

S_ISCHR(m)字符设备?

     

S_ISBLK(m)块设备?

     

S_ISFIFO(m)FIFO(命名管道)?

     

S_ISLNK(m)符号链接? (不在POSIX.1-1996中。)

     

S_ISSOCK(m)套接字? (不在POSIX.1-1996中。)

以下是一段示例代码:

stat(pathname, &sb);
if (S_ISREG(sb.st_mode)) {
   /* Handle regular file */
}

至于阅读,使用函数sprintf连接目录路径和文件名以获取文件路径,如下所示:

sprintf(file_path, "%s/%s", dir_path, file_name);