Linux下文件的相关操作函数Word格式文档下载.docx
- 文档编号:21048912
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:39
- 大小:30.83KB
Linux下文件的相关操作函数Word格式文档下载.docx
《Linux下文件的相关操作函数Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Linux下文件的相关操作函数Word格式文档下载.docx(39页珍藏版)》请在冰豆网上搜索。
S_IROTH其他人可以读S_IWOTH其他人可以写
S_IXOTH其他人可以执行S_IRWXO其他人可以读写执行
S_ISUID设置用户执行IDS_ISGID设置组的执行ID
我们也可以用数字来代表各个位的标志.Linux总共用5个数字来表示文件的各种权限.
第一位表示设置用户ID.
第二位表示设置组ID,
第三位表示用户自己的权限位,
第四位表示组的权限,
最后一位表示其他人的权限.
每个数字可以取1(执行权限),2(写权限),4(读权限),0(什么也没有)或者是这几个值的和.比如我们要创建一个用户读写执行,组没有权限,其他人读执行的文件。
设置用户ID位那么我们可以使用的模式是--1(设置用户ID)0(组没有设置)7(1+2+4)0(没有权限,使用缺省)5(1+4)即10705:
open("
temp"
O_CREAT,10705);
如果我们打开文件成功,open会返回一个文件描述符.我们以后对文件的所有操作就可以对这个文件描述符进行操作了.
当我们操作完成以后,我们要关闭文件了,只要调用close就可以了,其中fd是我们要关闭的文件描述符.
文件打开了以后,我们就要对文件进行读写了.我们可以调用函数read和write进行文件的读写.
ssize_tread(intfd,void*buffer,size_tcount);
ssize_twrite(intfd,constvoid*buffer,size_tcount);
fd是我们要进行读写操作的文件描述符.
buffer是我们要写入文件内容或读出文件内容的内存地址.
count是我们要读写的字节数.
对于普通的文件read从指定的文件(fd)中读取count字节到buffer缓冲区中(记住我们必须提供一个足够大的缓冲区),同时返回count.
如果read读到了文件的结尾或者被一个信号所中断,返回值会小于count.
如果是由信号中断引起返回,而且没有返回数据,read会返回-1,且设置errno为EINTR.
当程序读到了文件结尾的时候,read会返回0.
write从buffer中写count字节到文件fd中,成功时返回实际所写的字节数.
下面我们学习一个实例,这个实例用来拷贝文件,该程序已检测通过
#include<
unistd.h>
fcntl.h>
stdio.h>
sys/types.h>
sys/stat.h>
errno.h>
string.h>
#defineBUFFER_SIZE1024
intmain(intargc,char**argv)
{
intfrom_fd,to_fd;
intbytes_read,bytes_write;
charbuffer[BUFFER_SIZE];
char*ptr;
if(argc!
=3)
{
fprintf(stderr,"
Usage:
%sfromfiletofile\n\a"
argv[0]);
exit
(1);
}
if((from_fd=open(argv[1],O_RDONLY))==-1)
Open%sError:
%s\n"
argv[1],strerror(errno));
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
argv[2],strerror(errno));
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
if((bytes_read==-1)&
&
(errno!
=EINTR))break;
elseif(bytes_read>
0)
{
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
{
if((bytes_write==-1)&
=EINTR))break;
elseif(bytes_write==bytes_read)break;
elseif(bytes_write>
{
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
if(bytes_write==-1)break;
}
close(from_fd);
close(to_fd);
exit(0);
}
2.文件的各个属性
文件具有各种各样的属性,除了我们上面所知道的文件权限以外,文件还有创建时间,大小等等属性.有时侯我们要判断文件是否可以进行某种操作(读,写等等).这个时候我们可以使用access函数.
intaccess(constchar*pathname,intmode);
pathname是文件名称,
mode是我们要判断的属性.可以取以下值或者是他们的组合.
R_OK文件可以读,W_OK文件可以写,X_OK文件可以执行,F_OK文件存在.
当我们测试成功时,函数返回0,否则如果有一个条件不符时,返回-1.
如果我们要获得文件的其他属性,我们可以使用函数stat或者fstat.
intstat(constchar*file_name,structstat*buf);
intfstat(intfiledes,structstat*buf);
structstat
dev_t st_dev;
/*设备*/
ino_t st_ino;
/*节点*/
mode_t st_mode;
/*模式*/
nlink_t st_nlink;
/*硬连接*/
uid_t st_uid;
/*用户ID*/
gid_t st_gid;
/*组ID*/
dev_t st_rdev;
/*设备类型*/
off_t st_off;
/*文件字节数*/
unsignedlong st_blksize;
/*块大小*/
unsignedlong st_blocks;
/*块数*/
time_t st_atime;
/*最后一次访问时间*/
time_t st_mtime;
/*最后一次修改时间*/
time_t st_ctime;
/*最后一次改变时间(指属性)*/
};
stat用来判断没有打开的文件,而fstat用来判断打开的文件.我们使用最多的属性是st_mode.通过着属性我们可以判断给定的文件是一个普通文件还是一个目录,连接等等.可以使用下面几个宏来判断.
S_ISLNK(st_mode):
是否是一个连接.
S_ISREG是否是一个常规文件.
S_ISDIR是否是一个目录.
S_ISCHR是否是一个字符设备.
S_ISBLK是否是一个块设备.
S_ISFIFO是否是一个FIFO文件.
S_ISSOCK是否是一个SOCKET文件.
3.目录文件的操作
在我们编写程序的时候,有时候会要得到我们当前的工作路径。
C库函数提供了getcwd来解决这个问题。
char*getcwd(char*buffer,size_tsize);
我们提供一个size大小的buffer,getcwd会把我们当前的路径考到buffer中.如果buffer太小,函数会返回-1和一个错误号.
Linux提供了大量的目录操作函数,我们学习几个比较简单和常用的函数:
intmkdir(constchar*path,mode_tmode);
DIR*opendir(constchar*path);
structdirent*readdir(DIR*dir);
voidrewinddir(DIR*dir);
off_ttelldir(DIR*dir);
voidseekdir(DIR*dir,off_toff);
intclosedir(DIR*dir);
structdirent
long d_ino;
off_t d_off;
unsignedshort d_reclen;
char d_name[NAME_MAX+1];
/*文件名称*/
}
mkdir:
很容易就是我们创建一个目录.
opendir:
打开一个目录为以后读做准备.
readdir:
读一个打开的目录.
rewinddir:
是用来重读目录的,和我们学的rewind函数一样.
closedir:
是关闭一个目录.
telldir和seekdir类似与ftell和fseek函数.
下面我们开发一个小程序,这个程序有一个参数.如果这个参数是一个文件名,我们输出这个文件的大小和最后修改的时间,如果是一个目录我们输出这个目录下所有文件的大小和修改时间.
staticintget_file_size_time(constchar*filename)
structstatstatbuf;
if(stat(filename,&
statbuf)==-1)
printf("
Getstaton%sError:
filename,strerror(errno));
return(-1);
if(S_ISDIR(statbuf.st_mode))return
(1);
if(S_ISREG(statbuf.st_mode))
%ssize:
%ldbytes\tmodifiedat%s"
filename,statbuf.st_size,ctime(&
statbuf.st_mtime));
return(0);
DIR*dirp;
structdirent*direntp;
intstats;
=2)
%sfilename\n\a"
if(((stats=get_file_size_time(argv[1]))==0)||(stats==-1))
exit
(1);
if((dirp=opendir(argv[1]))==NULL)
OpenDirectory%sError:
argv[1],strerror(errno));
while((direntp=readdir(dirp))!
=NULL)
if(get_file_size_time(direntp-br>
closedir(dirp);
exit
(1);
4.管道文件
Linux提供了许多的过滤和重定向程序,比如morecat等等.还提供了<
>
|<
<
等等重定向操作符.在这些过滤和重定向程序当中,都用到了管道这种特殊的文件.系统调用pipe可以创建一个管道.
intpipe(intfildes[2]);
pipe调用可以创建一个管道(通信缓冲区).当调用成功时,我们可以访问文件描述符fildes[0],fildes[1].其中fildes[0]是用来读的文件描述符,而fildes[1]是用来写的文件描述符.
在实际使用中我们是通过创建一个子进程,然后一个进程写,一个进程读来使用的.
#defineBUFFER255
charbuffer[BUFFER+1];
intfd[2];
%sstring\n\a"
if(pipe(fd)!
=0)
PipeError:
%s\n\a"
strerror(errno));
if(fork()==0)
close(fd[0]);
Child[%d]Writetopipe\n\a"
getpid());
snprintf(buffer,BUFFER,"
%s"
argv[1]);
write(fd[1],buffer,strlen(buffer));
Child[%d]Quit\n\a"
exit(0);
else
close(fd[1]);
Parent[%d]Readfrompipe\n\a"
memset(buffer,'
\0'
BUFFER+1);
read(fd[0],buffer,BUFFER);
Parent[%d]Read:
getpid(),buffer);
为了实现重定向操作,我们需要调用另外一个函数dup2.
intdup2(intoldfd,intnewfd);
dup2将用oldfd文件描述符来代替newfd文件描述符,同时关闭newfd文件描述符.也就是说,所有向newfd操作都转到oldfd上面.下面我们学习一个例子,这个例子将标准输出重定向到一个文件.
intfd;
%soutfilename\n\a"
if((fd=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR))==-1)
if(dup2(fd,STDOUT_FILENO)==-1)
RedirectStandardOutError:
fprintf(stderr,"
Now,pleaseinputstring"
);
(ToquituseCTRL+D)\n"
while
(1)
fgets(buffer,BUFFER_SIZE,stdin);
if(feof(stdin))break;
write(STDOUT_FILENO,buffer,strlen(buffer));
}
5.其他文件操作函数
5.01access判断是否具有存取文件的权限
头文件
#include<
定 义
intaccess(constchar*pathname,intmode);
函数说明
access()会检查是否可以读/写某一已存在的文件。
参数mode有几种情况组合,R_OK,W_OK,X_OK和F_OK。
R_OK,W_OK与X_OK用来检查文件是否具有读取、写入和执行的权限。
F_OK则是用来判断该文件是否存在。
由于access()只作权限的核查,并不理会文件形态或文件内容,因此,如果一目录表示为"
可写入"
,表示可以在该目录中建立新文件等操作,而非意味此目录可以被当做文件处理。
例如,你会发现DOS的文件都具有"
可执行"
权限,但用execve()执行时则会失败。
返回值
若所有欲查核的权限都通过了检查则返回0值,表示成功,只要有一权限被禁止则返回-1。
错误代码
EACCESS 参数pathname所指定的文件不符合所要求测试的权限。
EROFS 欲测试写入权限的文件存在于只读文件系统内。
EFAULT 参数pathname指针超出可存取内存空间。
EINVAL 参数mode不正确。
ENAMETOOLONG参数pathname太长。
ENOTDIR 参数pathname为一目录。
ENOMEM 核心内存不足
ELOOP 参数pathname有过多符号连接问题。
EIO I/O存取错误。
附加说明
使用access()作用户认证方面的判断要特别小心,例如在access()后再做open()的空文件可能会造成系统安全上的问题。
范 例
/*判断是否允许读取/etc/passwd*/
intmain()
{
if(access("
/etc/passwd"
R_OK)==0)
printf("
/etc/passwdcanberead\n"
5.02alphasort 依字母顺序排序目录结构
dirent.h>
intalphasort(conststructdirent**a,cons
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 下文 相关 操作 函数