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. 一个基于.NET平台的自动化/压力测试系统设计简述

    AutoTest系统设计概述 AutoTest是一个基于.NET平台实现的自动化/压力测试的系统,可独立运行于windows平台下,支持分布式部署,不需要其他配置或编译器的支持.(本质是一个基于协议的 ...

  2. EF实体框架之CodeFirst八

    前面七篇基本把Code First学习了一下,不过code first中会出现一个问题,就是数据迁移的问题. 一.数据准备 还是在前面的demo上修改,这次使用Province和City类. publ ...

  3. Orchard常见问题

    本文链接:http://www.cnblogs.com/souther/p/4543299.html 什么是Orchard Orchard是一个免费,开源,注重社区的项目,其目标是提供ASP.NET平 ...

  4. promise与aysnc 与EventProxy

    promise 已经是 es6推荐的内置的东西了,所以我们需要清楚. promise的使用类似与jquery的链式操作,.then()  .then()中不断使用.回调看上去清晰明了,建议使用. as ...

  5. “未能加载文件或程序集“EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”

    产生原因: 使用nuget管理程序包,同一个解决方案里面有不同版本的Entity Framework,有可能在不同时间安装不同版本的Entity Framework,所以出现这个问题. 解决方案: 1 ...

  6. 微信支付PHP SDK —— 公众号支付代码详解

    在微信支付 开发者文档页面 下载最新的 php SDK http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 这里假设你已经申请完微 ...

  7. “耐撕”团队2016.04.14站立会议

    1. 时间 : 19:20--19:40  共计20分钟 2. 人员 : Z   郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客 ...

  8. oracle 分区表

    分区表用途 分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中.分区完全对应用透明.Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间 ...

  9. 如何解决mysql数据库X小时无连接自动关闭

    windows下打开my.ini,增加: interactive_timeout=28800000 wait_timeout=28800000 专家解答:MySQL是一个小型关系型数据库管理系统,由于 ...

  10. GPUImage学习

    1.GLProgram--加载vertex和fragment的shader. 好处是完全将shader模块的加载过程独立出来. 学习:每个函数处理一件事,且函数的粒度刚好 在glLinkProgram ...