Linux程序设计(10)第三章:文件操作(2)其他文件管理有关的系统调用 lseek,fstat/stat/lstat,dup
1. lseek
lseek 系统调用对文件描述符fildes的读写指针进行设置
用它来设置文件的 卜一个读写位置。
1.1 原型
#include <unistd.h>
#include <sys/types.h>
off_t lseek(int fildes, off_t offset, int whence);
1.2 参数:
offset:参数用来指定位置,而whence参数定义该偏移值的用法。
whence可以取下列值之一。
SEEK_SET: offset是一个绝对位置。
SEEK_CUR: offset是相对于当前位置的一个相对位置。
SEEK_END: offset是相对于文件尾的一个相对位置。
1.3 返回值
lseek 返回从文件头到文件指针被设置处的字节偏移值,失败时返回-1。
1.4 代码例子:
……
/* 移动至文件开始处 或者叫做 定位至文件开始处*/
(VOID)lseek(iFd, 0, SEEK_SET);
if(-1 == write(iFd,szWriteBuff,sizeof(szWriteBuff)))
{
ulErr = ERROR_FAILED;
}
1.5 lseek 和 fseek 作用相同
fseek 移动文件流的读写位置
格式:
int fseek(FILE *stream, long offset, int fromwhere)
stream:文件流
offset:正(前移),可以为负(向后移),或者为0(保持不动)。
whence 是模式,该参数确定起始点
返回值:
正常返回0;错误返回-1
例如:
fseek(fp, 0L, SEEK_SET); //定位至文件开始处
fseek(fp, 10L, SEEK_SET); //定位至文件中的第10个字节
fseek(fp, 2L, SEEK_CUR); //从文件当前位置前移2个字节
fseek(fp, 0L, SEEK_END); //定位至文件结尾
fseek(fp, -10, SEEK_END); //从文件结尾处回退10个字节
fseek(fp,50L,0);或fseek(fp,50L,SEEK_SET); //将位置指针移到离文件头50个字节处
2. fstat stat 和 lstat 系统调用
这三个函数的功能是一致的,都用于获取文件相关信息,但应用于不同的文件对象。
2.1 原型
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int fstat(int fildes, struct stat *buf);
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
2.1 fstat
fstat: 系统调用返回与打开的文件描述符相关的文件的状态信息,该信息将会写到一个buf结构中。
2.1 stat 和 lstat
stat和Istat返回的是通过文件名查到的状态信息
2.3 struct stat
2.4 例子(获取文件大小 ):
struct stat stFileInfo;
ULONG ulFileSize;
LONG lresp_code = -1;
if (0 != stat(pcFileName, &stFileInfo))
{
printf("stat pcFileName error.\r\n");
return -1;
}
//获取文件大小
ulFileSize = (ULONG)stFileInfo.st_size;
3. dup 和dup2 系统调用
dup系统调用提供了一种复制文件描述符的方法,使我们能够通过两个或者更多个不同的描述符 来访问同一个文件。
这可以用于在文件的不同位置对数据进行读写。
#include <unistd.h>
int dup(int fildes);
//dup系统调用复制文件描述符 fildes,返回一个新的描述符。
int dup2(int fildes, int fildes2);
//dup2系统调用则是通过明确指定目标描述符来把一个文件描述符复制为另外一个