关于属性的结构

在linux下文件和文件夹都被认为是文件, 所以以下的这个属性对文件和文件夹通用

获取属性的函数有stat/fstat/lstat/fstat

struct    stat{
mode_t st_mode; //文件类型和读写权限
ino_t st_ino;
dev_t st_dev;
dev_t st_rdev;
nlink_t st_nlink;
uid_t st_uid; //文件拥有者的ID
gid_t st_gid; //文件拥所在的用户组
offt_t st_size; //文件大小
struct timespec st_atime;
struct timespec st_mtime;
struct timespec st_ctime;
blksize_t st_blksize;
blkcnt_t st_blocks;
} struct stat buf;
char *pathname="./test.txt";
if(lstat(pathname, &buf) < 0){
printf("lstat error");
exit(1);
}

文件类型

linux下文件分为以下几种:

1.普通文件(regular file), 判断函数为S_ISREG();

2.目录文件(directory file), 判断函数为S_ISDIR();

3.块特殊文件(block special file), S_ISBLK();

3.字符特殊文件(character special file), S_ISCHR();

5.进程通信管道文件(FIFO), S_ISFIFO();

6.套接字(socket), S_ISSOCK();

7.符号链接(symbolic link), S_ISLNK();

struct stat buf;
char *pathname="./test.txt";
if(lstat(pathname, &buf) < 0){
printf("lstat error");
exit(1);
} if(S_ISREG(buf.st_mode))
printf("this is a regular file");
else if(S_ISDIR(buf.st_mode))
printf("this is a directory");
else if(..)
...
else
printf("unknown file type");

测试访问权限

文件有读/写/执行三种权限, 文件的拥有者对文件可能有读/写/执行的权限, 同组的可能有读/执行的权限, 而不同组的可能连读的权限都没有

所以在我们对已存在的文件进行读写操作时, 可以先进行访问权限判断

int access(const char *pathname, int mode), mode有三个供选择参数:R_OK, W_OK, X_OK, 分别是读/写/执行

char *pathname="./test.txt";
if(access(pathname,R_OK) < 0){
perror("access error");
exit(1);
}else
printf("read access"); int fd;
if((fd=open(pathname,O_RDONLY))<0){
printf("open error");
exit(1);
}else
printf("open for reading");

更改访问权限

更改文件的访问权限条件需至少需满足一项:1.超级用户进程进行更改; 2.文件拥有者的进程进行更改

文件权限的设置分成三部分, 分别作用于:

1.文件的拥有者,S_IRUSR,S_IWUSR,S_IXUSR,三合一的写法为S_IRWXU

2.同组的用户,S_IRGRP,S_IWGRP,S_IXGRP,三合一的写法为S_IRWXG

3.其它组的用户,S_IROTH,S_IWOTH,S_IXOTH,三合一的写法为S_IRWXO

以上权限依次为读, 写, 执行, 三合一的包含三个权限

更改的函数有chmod/fchmod/fchmodat

struct stat buf;
char *pathname="./test.txt";
if(stat(pathname,&buf)<0){
printf("stat error");
exit(1);
} //只关掉S_IXGRP
if(chmod(pathname,buf.st_mode & ~S_IXGRP)<0)
printf("chmod error"); //不管当前的权限, 以绝对的方式设置
if(chmod(pathname,S_IRUSR|S_IWUSR|S_IRGRP)<0)
printf("chmod error");

更改文件拥有者

该操作在大多数linux系统中需要root来执行

chown/fchown/fchownat/lchown

int chown (const char *pathname, uid_t owner, gid_t group);

//假设当前系统有个普通用户组的用户,ID和组ID都为1000
//以root身份运行, sudo root
char *pathname="./test.txt";
if(chown(pathname,1000,1000)<0)
printf("chown failed");

文件大小

struct stat buf;
char *pathname="./test.txt";
if(lstat(pathname,&buf)<0){
printf("lstat error");
exit(1);
}
printf("file size: %lu",buf.st_size);

另外可以用truncate(pathname,0)将文件大小设置成0,也就是擦除文件内容

其它

创建文件: int creat(const char *path, mode_t mode) mode为访问权限,用open也可以创建文件

文件重命名: int rename(const char *oldname, const char *newname)

删除文件: int remove(const char *pathname)

linux 文件属性的更多相关文章

  1. linux文件属性详细说明

    1. Linux 文件属性概说: Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容: [root@localhost ...

  2. linux文件属性权限相关

    一个linux目录或者文件,都会有一个所属主和所属组. 所属主,即文件的拥有者,而所属组,即该文件所属主所在的一个组. linux文件属性 包括文件类型 - d  l  b c s 依次表示 普通文件 ...

  3. Linux学习之CentOS(四)----Linux文件属性、所有者、群组、其他组及文件权限操作简要总结

    Linux文件属性.所有者.群组.其他组及文件权限操作简要总结 首先介绍一个重要的知识点:文件属性控制权限 [root@www ~]# ls -al total 156 drwxr-x--- 4 ro ...

  4. Linux文件属性及权限

    一.Linux文件属性: 例如: drwxr-xr-x 2 hdy hdy 4096 11月 28 00:18 桌面 drwxr-xr-x 2 hdy hdy 4096 11月 28 00:18 桌面 ...

  5. Linux 文件属性及权限_007

    Linux一切皆文件: Llinux系统的文件或目录的属性主要包括:索引节点.文件类型.文件权限.链接数.所属的用户和用户组.最近修改时间等. Llinux文件属性及权限图形说明: Linux文件属性 ...

  6. Linux文件属性,类型,ls -lhi解释行列

    Linux文件属性(描述信息) -i inode节点号 -h 人类可读 ls -lhi 1703938 drwxr-xr-x 2 rsync rsync 4.0K Jun 7 07:24 gamese ...

  7. Linux 文件属性及修改权限

    输入 ll 或 ls -l 命令显示当前目录中文件的属性及文件所属的用户和组 root@user:/home/www# ll test total 880 drwxr-xr-x 2 root root ...

  8. Linux文件属性与权限

    一.在Linux里面,任何一个文件都具有“User,Group,Others”(用户.用户组.其他人)三种身份 二.用户组最有用的功能之一,就是当你在团队开发资源的时候,且每个账号都可以有多个用户组的 ...

  9. 15、Linux 文件属性和测试( chgrp,chown,chmod和-e -f -d -s

    一.更改文件属性 1.chgrp:更改文件属组 语法: chgrp [-R] 属组名文件名 参数选项 -R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件 ...

  10. Linux学习之十二-Linux文件属性

    Linux文件属性 在Linux中,对于每个文件都有相应属性,以Linux中root用户家目录下新建文件a.txt为例,在a.txt中输入几个字符 使用命令ls -ild a.txt查看文件的权限等 ...

随机推荐

  1. java 生成UUID

    UUID(Universally Unique Identifier)全局唯一标识符,是一个128位长的数字,一般用16进制表示. 算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成UUID, ...

  2. 基本API-StdIn.java

    /************************************************************************* * Compilation: javac StdI ...

  3. eclipse bookmark的使用

    为什么要使用bookmark 写代码一般不是从上往下写,经常在几个模块之间变换的写,你可能使用搜索功能ctrl+f,ctrl+c,这样查找位置将会变的非常痛苦. 因为重要的位置一般就那么几个,如定义部 ...

  4. 剑指Offer36 数字在排序数组中出现的次数

    /************************************************************************* > File Name: 36_Number ...

  5. 使用Boost asio实现异步的TCP/IP通信

    可以先了解一下Boost asio基本概念,以下是Boost asio实现的异步TCP/IP通信: 服务器: #include "stdafx.h" #include <io ...

  6. asp.net for itextsharp 操作pdf

    今天分享下昨天做的一个东西 asp.net 的文件 zip 批量下载,首先你需要去 到http://dotnetzip.codeplex.com这个站点下载zip 的包,在里面找到 Ionic.Zip ...

  7. 北大ACM(POJ1014-Dividing)

    Question:http://poj.org/problem?id=1014 问题点:抽屉原理.dfs.多重背包. Memory: 248K Time: 16MS Language: C++ Res ...

  8. php读取目录下的文件

    工作需要写了一个读取指定目录下的文件,并显示列表,点击之后读取文件中的内容 高手拍砖,目录可以自由指定,我这里直接写的是获取当前文件目录下面的所有文件 <?php /** * 读取指定目录下面的 ...

  9. ./configure:command not found 解决方法

    有些下载下来的源码没有MAKEFILE文件,但是会有MAKEFILE.IN 和 configure, MAKEFILE文件则由后两个文件生成. 如果执行: $./configure   提示错误:./ ...

  10. (转)集成架构:对比 Web API 与面向服务的架构和企业应用程序集成

    摘要:总体上讲,SOA 和 Web API 似乎解决的是同一个问题:以实时的.可重用的方式公开业务功能.本教程将分析这些举措有何不同,以及如何将它们融入到一个不断演变的集成架构中.文中还将讨论 API ...