linux系统文件操作函数(三)

时间:2021-06-19 08:39:53

1 access 函数
作用
测试指定文件是否拥有某种权限
头文件:unistd.h
原型
int access(const char *pathname, int mode);
参数
pathname –> 文件名
mode –> 权限类别
R_OK 是否有读权限
W_OK 是否有写权限
X_OK 是否有执行权限
F_OK 测试一个文件是否存在
返回值
0 –> 所有欲查核的权限都通过了检查
-1 –> 有权限被禁止

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h> 
int main(int argc,char *argv[])
{
      if(argc<2)
      {
              printf("no file,\n");
              exit(1);
      }
      int ret = access(argv[1],W_OK);
      if(ret == -1)
      {
              perror("access");
              exit(1);
      }
      printf("you can write this file.\n");
      return 0;
}

2 chmod函数
作用
改变文件的权限
原型
int chmod( const char *filename, int pmode );
参数
filename –> 文件名
pmode –> 权限
必须是一个8进制数
返回值
0 –> 改变成功
-1 –> 失败

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h> 
int main(int argc,char *argv[])
{
      if(argc<2)
      {
              printf("no file,\n");
              exit(1);
      }
      int ret = chmod(argv[1],0777);
      if(ret == -1)
      {
              perror("chmod");
              exit(1);
      }
      printf("you can chmod this file.\n");
      return 0;
}

3 chown函数
作用
改变文件的所有者
原型
int chown(const char *path, uid_t owner, gid_t group);
返回值
0 –> 成功
-1 –> 失败
4 truncate函数

   表头文件:#include <unistd.h>
原型
    int truncate(const char *path, off_t length);
        path --> 文件路径
        length --> 指定的文件大小
         **注释:
         (1)如果当前文件的大小为100字节。指定的length为20字节。那么执行结果是这个文件只剩20字节,其他80字节会被删除。
         (2)如果当前文件大小为100字节,指定length为300字节。那么执行结果是这个文件被拓展了。
返回值
    0 --> 执行成功
    -1 --> 执行失败


   #include<stdlib.h>
   #include<stdio.h>
   #include<unistd.h>
   int main(int argc,char *argv[])
   {
         if(argc<2)
         {
                 printf("no file,\n");
                 exit(1);
         }
         int ret = truncate(argv[1],17);
         if(ret == -1)
         {
                 perror("truncate");
                 exit(1);
         }
         printf("%s has been truncated.\n",argv[1]);
         return 0;
   }

5 链接
(1)link函数
作用
创建一个硬链接可以达到与“ln ”命令一样的效果。
原型
int link(const char *oldpath, const char *newpath);
(2)symlink 函数,函数形式与link一样
作用:创建一个软连接,可以达到与“ln -s ”命令一样的效果。
(3)readlink 函数
原型 ssize_t readlink(const char *path, char *buf, size_t bufsiz);
作用:读软连接对应的文件名,不是读内容
(4)unlink 函数
作用
删除一个文件的目录项并减少它的链接数,若成功则返回0,否则返回-1,错误原因存于errno。
如果想通过调用这个函数来成功删除文件,你就必须拥有这个文件的所属目录的写和执行权限。
原型:
int unlink(const char * pathname);
使用
1. 如果是符号链接,删除符号链接
2. 如果是硬链接,硬链接数减1,当减为0时,释放数据块和inode
3. 如果文件硬链接数为0,但有进程已打开该文件,并持有文件描述符,则等该进程关闭该文件时,kernel才真正去删除该文件利用该特性创建临时文件,先open或creat创建一个文件,马上unlink此文件

int main(int argc,char *argv[])
{
if(argc<2)
{
printf(“no file,\n”);
exit(1);
}

  int fd = open(argv[1],O_RDWR|O_CREAT,0777);//***创建一个临时文件***
  if(fd == -1)
    {
            perror("error");
            exit(1);
    }
  int ret = unlink(argv[1]);//**删除文件,但由于此时文件是打开的,不能删除掉**
  if(ret == -1)
  {
          perror("unlink");
          exit(1);
  }

 write(fd,"this is my test\n",100);//写文件
 lseek(fd,0,SEEK_SET);//**将文件指针复位**
 char buf[100]={0};
 read(fd,buf,sizeof(buf));//读文件
 printf("%s\n",buf);

close(fd);//**关闭文件。此时临时文件会被unlink删除。**

 return 0;

}