C open() 目录没有报错
C open() directory no error
我有一个函数可以打开文件然后读取这些文件,使用标准的 open() 和 read() 函数。我将 errno 变量用于所有可能的错误,例如权限被拒绝或没有这样的文件或目录,但是当我在目录上使用 open 时它不会 return 错误它只是打开它并尝试读取它。
那么,当我打开一个目录时,如何得到一个错误信息呢?
目录也是一个文件(按Unix/Linux来说)。所以通常你不会得到错误。您可以使用 stat or fstat 功能来跟踪普通或特殊文件。
当您使用 stat 或 fstat 时,您需要像 struct stat var
一样声明一个 struct stat 变量。 stat
结构有一个名为 st_mode
的成员,它包含文件类型的信息。
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
目录在Unix*中也是一个文件,如果你想避免open()
打开一个目录,你可能需要检查文件类型。正如@nayabbashasayed 所说,您可以使用 stat
检查文件类型和更多信息。
这是一个示例代码,通过 stat
:
检查类型
const char *filePath;
struct stat fileStatBuf;
if(stat(filePath,&fileStatBuf) == -1){
perror("stat");
exit(1);
}
/*
*You can use switch to check all
*the types you want, now i just use
*if to check one.
*/
if((fileStatBuf.st_mode & S_IFMT) == S_IFDIR){
printf("This type is directory\n");
}
希望对您有所帮助。
我不想使用其他任何东西作为读写,我发现错误是在使用 read() 而不是 open( )
我有一个函数可以打开文件然后读取这些文件,使用标准的 open() 和 read() 函数。我将 errno 变量用于所有可能的错误,例如权限被拒绝或没有这样的文件或目录,但是当我在目录上使用 open 时它不会 return 错误它只是打开它并尝试读取它。 那么,当我打开一个目录时,如何得到一个错误信息呢?
目录也是一个文件(按Unix/Linux来说)。所以通常你不会得到错误。您可以使用 stat or fstat 功能来跟踪普通或特殊文件。
当您使用 stat 或 fstat 时,您需要像 struct stat var
一样声明一个 struct stat 变量。 stat
结构有一个名为 st_mode
的成员,它包含文件类型的信息。
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
目录在Unix*中也是一个文件,如果你想避免open()
打开一个目录,你可能需要检查文件类型。正如@nayabbashasayed 所说,您可以使用 stat
检查文件类型和更多信息。
这是一个示例代码,通过 stat
:
const char *filePath;
struct stat fileStatBuf;
if(stat(filePath,&fileStatBuf) == -1){
perror("stat");
exit(1);
}
/*
*You can use switch to check all
*the types you want, now i just use
*if to check one.
*/
if((fileStatBuf.st_mode & S_IFMT) == S_IFDIR){
printf("This type is directory\n");
}
希望对您有所帮助。
我不想使用其他任何东西作为读写,我发现错误是在使用 read() 而不是 open( )