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

statまたは関数を使用しfstatます(最初のものはパスで動作し、2番目のものはファイル記述子で動作します)、その仕事をする関数は次のとおりです。

    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 し、構造体 struct stat の属性をチェックしてからそれst_modeがディレクトリかファイルかを確認してから、それを開こうとすることができます。

例:

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 に答える
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 に答える