linux 文件属性

关于属性的结构

在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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 在linux中我们经常能看到各种文件,有时不清楚它们具体的含义 下面让我我通过命令ls -lh /ect/ 查看...
    dxlong阅读 676评论 1 0
  • 格式 文件类型 所有者权限 组权限 其他用户权限 第一个字符表示文件类型,如下: 文件属性中剩下的9个字符称为文件...
    NoFacePeace阅读 294评论 0 0
  • FACL:filesystem access control list,文件系统访问控制列表 FACL可以针对单一...
    ifcoder阅读 324评论 0 1
  • 【rwx】这三个权限的位置不会改变,如果没有该权限则使用【-】表示 1、r(read):只读,代表数值 4 2、w...
    klisly阅读 119评论 0 0
  • 但凡值得一做的事情,自有值得去做的价值。——村上春树《当我跑步时我谈些什么》 今天是一个平凡又不平凡的日子,因为今...
    韩小梅阅读 1,894评论 7 6