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. Photoshop Cc高级设计师培训视频教程(共109节课程)

    Photoshop Cc高级设计师培训视频教程(共109节课程) 专业培训Photoshop技能,其他网站收费内容,这里收集了,免费分享给你们哦~ 以下为部分截图: 下载地址: http://fu83 ...

  2. [CareerCup] 4.7 Lowest Common Ancestor of a Binary Search Tree 二叉树的最小共同父节点

    4.7 Design an algorithm and write code to find the first common ancestor of two nodes in a binary tr ...

  3. 1.1Linux 系统简介(学习过程)

    =====课程笔记===== 一.Linux 为何物 Linux 是一个操作系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS . Linux 也就是系统调用和内核两层,我们使 ...

  4. RocEDU.阅读.写作《你的灯亮着吗?》

    <你的灯亮着吗?> 一.对本书的认识 这本书的作者就如何训练思维能力指点迷津.书中提及的观点包括"问题是理想状态和现实状态之间的差别",以及"无论表面上表现的 ...

  5. 软件工程(GZSD2015)第二次作业文档模板

    题目: (此处列出题目) 需求分析: 基本功能 基本功能点1 基本功能点2 ... 扩展功能(可选) 高级功能(可选) 设计 设计点1 设计点2 ... 代码实现 // code here 程序截图 ...

  6. java 中Handler 和Runnable 的使用 异步发送消息 转

    public class MainActivity extends Activity { TextView text1, text2; Button button; Thread th; @Overr ...

  7. WIN8 浏览器排版不兼容问题

    经常访问网站失败 访问部分网站只显示白底蓝字没有排版也没有图片 尝试了网上的各种方法,也是用了360和百度安全管家的网页修复 重置了IE设置 都不行!!! 最后有效的方法是 更换DNS 208.67. ...

  8. IDEA SSH

    被IDEA各种虐0.0各种配置,没有人教就百度,别人也弄了点,然后整整花了一天,从eclipse转到IDEA真的不容易啊TT

  9. 我从腾讯那“偷了”3000万QQ用户数据,出了份很有趣的独家报告!

    声明: 1.目前程序已停止运行!QQ空间也已升级访问安全机制. 2.本“分析”数据源自部分用户的公开信息,并未触及隐私内容,广大网友无需担心. 3.QQ空间会不定期发布大数据分析报告,感兴趣的朋友关注 ...

  10. 【Moqui业务逻辑翻译系列】--UBPL index

    h2. [UBPL Introduction] ubpl介绍h2. [Actor Definitions] 行为定义h2. General Business Process Stories 通常的商业 ...