2012-12-11 12:41 14214人阅读 评论(4) 收藏 举报
 分类:
Linux(8)  C/C++(20) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

在Linux中,可以利用stat()函数来获取一个文件的状态

  1. #include <sys/stat.h>
  2. #include <unistd.h>
  3. int stat(const char *file_name, struct stat *buf);

这个函数执行成功返回0,失败返回-1。取得的文件状态存放在buf指针指向的struct stat结构提中, struct stat的定义如下:

  1. struct stat
  2. {
  3. dev_t       st_dev;     /* ID of device containing file -文件所在设备的ID*/
  4. ino_t       st_ino;     /* inode number -inode节点号*/
  5. mode_t      st_mode;    /* 文件的类型和存取的权限*/
  6. nlink_t     st_nlink;   /* number of hard links -链向此文件的连接数(硬连接)*/
  7. uid_t       st_uid;     /* user ID of owner -user id*/
  8. gid_t       st_gid;     /* group ID of owner - group id*/
  9. dev_t       st_rdev;    /* device ID (if special file) -设备号,针对设备文件*/
  10. off_t       st_size;    /* total size, in bytes -文件大小,字节为单位*/
  11. blksize_t   st_blksize; /* blocksize for filesystem I/O -系统块的大小*/
  12. blkcnt_t    st_blocks;  /* number of blocks allocated -文件所占块数*/
  13. time_t      st_atime;   /* time of last access -最近存取时间*/
  14. time_t      st_mtime;   /* time of last modification -最近修改时间*/
  15. time_t      st_ctime;   /* time of last status change - */
  16. };

其中, st_mode这个变量用来判断文件类型。

st_mode是用特征位来表示文件类型的,特征位的定义如下:

  1. S_IFMT      0170000     文件类型的位遮罩
  2. S_IFSOCK    0140000     socket
  3. S_IFLNK     0120000     符号链接(symbolic link)
  4. S_IFREG     0100000     一般文件
  5. S_IFBLK     0060000     区块装置(block device)
  6. S_IFDIR     0040000     目录
  7. S_IFCHR     0020000     字符装置(character device)
  8. S_IFIFO     0010000     先进先出(fifo)
  9. S_ISUID     0004000     文件的(set user-id on execution)位
  10. S_ISGID     0002000     文件的(set group-id on execution)位
  11. S_ISVTX     0001000     文件的sticky位
  12. S_IRWXU     00700       文件所有者的遮罩值(即所有权限值)
  13. S_IRUSR     00400       文件所有者具可读取权限
  14. S_IWUSR     00200       文件所有者具可写入权限
  15. S_IXUSR     00100       文件所有者具可执行权限
  16. S_IRWXG     00070       用户组的遮罩值(即所有权限值)
  17. S_IRGRP     00040       用户组具可读取权限
  18. S_IWGRP     00020       用户组具可写入权限
  19. S_IXGRP     00010       用户组具可执行权限
  20. S_IRWXO     00007       其他用户的遮罩值(即所有权限值)
  21. S_IROTH     00004       其他用户具可读取权限
  22. S_IWOTH     00002       其他用户具可写入权限
  23. S_IXOTH     00001       其他用户具可执行权限
  24. 摘自《Linux C 函数库参考手册》

判断文件类型时,用对文件的st_mode的值与上面给出的值相与,再比较。比如:

  1. #include <sys/stat.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. int main()
  5. {
  6. int abc;
  7. struct stat buf;
  8. stat("/home", &buf);
  9. abc = buf.st_mode & S_IFDIR;//与对应的标志位相与
  10. if(abc == S_IFDIR)          //结果与标志位比较
  11. printf("It's a directory.\n");
  12. return 0;
  13. }

运行结果:

It's a directory.

其实还有一个简单的方法,文件类型在POSIX中定义了检查这些类型的宏定义:

  1. S_ISLINGK(st_mode)      判断是否位符号链接
  2. S_ISREG(st_mode)        是否为一般文件
  3. S_ISDIR(st_mode)        是否为目录
  4. S_ISCHR(st_mode)        是否位字符装置文件
  5. S_ISBLK(s3e)            是否先进先出
  6. S_ISSOCK(st_mode)       是否为socket

可以根据这些函数的返回值判断,如果是,则返回1。(我试了一下,好像是这样的)

来自:http://blog.csdn.net/simmerlee/article/details/8281399

Linux中用st_mode判断文件类型的更多相关文章

  1. php 读取文件头判断文件类型的实现代码

    php代码实现读取文件头判断文件类型,支持图片.rar.exe等后缀. 例子: <?php $filename = "11.jpg"; //为图片的路径可以用d:/uploa ...

  2. UNIX环境编程学习笔记(6)——文件I/O之判断文件类型

    lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: ...

  3. python准确判断文件类型

    判断文件类型在开发中非常常见的需求,怎样才能准确的判断文件类型呢?首先大家想到的是文件的后缀,但是非常遗憾的是这种方法是非常不靠谱的,因为文件的后缀是可以随意更改的,而大家都知道后缀在linux系统下 ...

  4. JavaScript根据文件名判断文件类型

    //JavaScript根据文件名判断文件类型 var imgExt = new Array(".png",".jpg",".jpeg",& ...

  5. 利用PHP取二进制文件头判断文件类型

    <?php $files = array('D:\no.jpg', 'D:\no.png','D:\no2.JPEG','D:\no.BMP'); $fileTypes = array( 779 ...

  6. PHP取二进制文件头快速判断文件类型的实现代码

    通过读取文件头信息来识别文件的真实类型. 一般我们都是按照文件扩展名来判断文件类型,但是这个很不靠谱,轻易就通过修改扩展名来躲避了,一般必须要读取文件信息来识别,PHP扩展中提供了类似 exif_im ...

  7. PHP取二进制文件头快速判断文件类型

    <?php /*文件扩展名说明 *7173 gif *255216 jpg *13780 png *6677 bmp *239187 txt,aspx,asp,sql *208207 xls.d ...

  8. PHP读取文件头(2字节)判断文件类型(转)

    看到此标题或许你会说是否是多此一举,直接判断扩展名不就知道文件类型了吗,但是扩展名很容易伪造,这样就绕过了判断.大部分的文件都会将一个特殊的数字或字符存放在文件的特定位置里(开始处的2个字节) /** ...

  9. 用java流方式判断文件类型

    这个方法只能在有限的范围内有效.并不是万金油 比如 图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断. 下面给出完整版代码 首先是文件类型枚取 packag ...

随机推荐

  1. WebSocket使用教程 2

    WebSocket使用教程 - 带完整实例 收藏 james_laughing 发表于 2年前 阅读 46438 收藏 23 点赞 5 评论 4 摘要: WebSocket使用教程 - 带完整实例 什 ...

  2. LeetCode:Clone Graph

    题目如下:实现克隆图的算法  题目链接 Clone an undirected graph. Each node in the graph contains a label and a list of ...

  3. Linux基础入门

    第一节,linux系统简介 一.实验内容 了解 Linux 的历史,Linux 与 Windows 的区别等入门知识. 二.实验要求 阅读linux简介与历史 三.实验步骤 (一).Linux 为何物 ...

  4. powerdesigner 绘制表关系和导出sql

    1.生成图(A图,B图) 2.创建关系(palette工具栏里有个线条,主表子表关系连接即可,拖动是由顺序的,一对多即从A表往B表连接) 3.这里小说一下   一开始是CDM模式,可以在软件最顶层看到 ...

  5. Windows下apache php wordpress配置

    2. Use notepad to open httpd.conf config file. Make use the line "LoadModule rewrite_module mod ...

  6. RockWare RockWorks的Ollydbg调试过程及注册机(破解)思路

    最近拿到了RockWorks15的安装包,可惜没有破解,试用也只能用14天.用PEiD工具察看了一下,Delphi编写的程序,竟然没加壳.本想用OllyDBG调试进去爆破一下,不意发现注册码很简单,如 ...

  7. RequireJS学习资料汇总

    入门系列 [1]阮一峰 RequireJS用法 [2]RequireJS入门指南 文档系列 [1]RequireJS中文文档 [2]RequireJS英文文档 代码实践 知识扩展 [1]计算机干了什么

  8. 第十四章:Annotation(注释)

    一:注解 1.当成是一种修饰符吧,修饰类及类的所有成员. 代码里的特殊标记,这些标记可以在编译.类加载.运行时被读取. 2.@Override:强制子类覆盖(重写)父类的方法. @Deprecated ...

  9. [转载]VS2012编译C语言scanf函数error的解决方法

    在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: error C4996: 'scanf': This function or variable may ...

  10. hdu1828 线段树+离散化+扫描线

    添加lb[],rb[]数组,来标记竖边.添加num,来计算竖边的个数,因为计算周长的时候,未覆盖的竖边都要加. #include<stdio.h> #include<stdlib.h ...