0

我想用 read() 函数读取文件,这是我的代码源:

char *buf;
    int bytesRead;
    int fildes;
    char path[128];
    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
    int flags = O_RDONLY;
    printf("\n%s-->Donner l'emplacement du fichier :%s ", CYAN_NORMAL, RESETCOLOR);
    scanf("%s", path);
    fildes = open(path, flags, mode);
    if(fildes == -1){
        printf("\nImpossible de lire le fichier. Réessayez plus tard. (%s)",strerror(errno));
    }else{
        while ((bytesRead = read(fildes, buf, sizeof buf)) > 0)
        {
            write(STDOUT_FILENO, buf, bytesRead);
        }
    }

问题是当我将目录作为程序读取它的路径时,并显示一个空行,就好像它是一个空文件一样。

我只想读取文件,并且当我将目录作为路径时,我希望我的程序显示一条消息。

我如何知道 open() 函数是否打开了文件或目录?

4

4 回答 4

2

使用statorfstat函数(第一个使用路径,第二个使用文件描述符)这是一个完成这项工作的函数:

    int isDir(char* path)
{
        struct stat buff;
        stat(path , &buff);
        if((buff.st_mode & S_IFMT) == S_IFDIR)
                return 0;
        else if ((buff.st_mode & S_IFMT) == S_IFREG)
                return 1;
        else
                return -1;

}
于 2013-10-20T13:12:18.053 回答
2

您可以fstat您的路径并在尝试打开之前检查st_mode结构struct stat的属性是目录还是文件。

例子:

int is_dir(const char* name)
{
    struct stat st;
    if (-1 == stat(name, &st)) {
      return -1; // check errno to see what went wrong
    }
    return (int)((st.st_mode & S_IFDIR) == S_IFDIR);
}
于 2013-10-20T13:12:32.023 回答
1

您可以在打开之前检查路径的类型:

struct stat statbuf;
if( stat(path,&statbuf) == 0 )
{
    if (S_ISDIR(statbuf.st_mode) )
    {
        //it's a directory
    }
    else if (S_ISREG(statbuf.st_mode) )
    {
        //it's a file
    }
    else
    {
        //something else
    }
}
于 2013-10-20T13:16:02.300 回答
0

通讯:

fildes = open(path, flags, mode);
if(fildes == -1){
    printf("\nImpossible de lire le fichier. Réessayez plus tard. (%s)",strerror(errno));
}else{
    struct stat statb;

    if (fstat(fildes, &statb) == -1)
        printf("\nImpossible de «fstat» le fichier. Réessayez plus tard. (%s)",
            strerror(errno));
    else if ((statb.st_mode & S_IFMT) == S_IFDIR)
        printf("\nC'est un dossier, pas un fichier.");
    else
    {
        while ((bytesRead = read(fildes, buf, sizeof buf)) > 0)
        {
            write(STDOUT_FILENO, buf, bytesRead);
        }
    }
}

(请随意修复我非常糟糕的法语;例如,我不知道“目录”的正确词是什么)。

fstat()可能比stat().

于 2014-04-19T18:05:40.123 回答