1.stat 获取文件属性
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *filename,struct stat *buf);
int fstat(fd, struct stat *buf);
int lstat(const char *filename, struct stat *buf);
fstat与stat的区别是fstat通过文件描述符指定文件;lstat与stat的区别在于,对于符号连接文件,lstat返回的是符号链接文件本身的状态信息,而stat返回的是符号链接指向的文件状态信心。
成功返回0,错误范围-1
2. chown 设置文件属性
#include <sys/types.h>
#include <unistd.h>
int chown(const char *path,uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group)’
int lchown(const char *path, uid_t owner,gid_t group);
fchown与chown的区别是fchown通过文件描述符指定文件;lchown与chown的区别在于,对于符号连接文件,lchown返回的是符号链接文件本身的状态信息,而chown返回的是符号链接指向的文件状态信心。
成功返回0,错误范围-1
文件的所有者只能改变文件的组id为其所属组中的一个,超级用户才能修改文件的所有者id,并且超级用户可以任意修改文件的用户组id。如果参数owner或group指定为-1,那么文件的用户id和组id不会被改变。
3. truncate 改变文件大小
#include <sys/types.h>
#include <unistd.h>
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
将指定文件大小改为参数length指定的大小,如果原来的文件比参数length大,则超过的部分会被删除;如果原来的文件大小比参数length小,则文件将被扩展,扩展部分用0填充。
成功返回0,错误范围-1
4. utime 改变文件的st_mtime域和st_ctime域,即存取时间和修改时间。
#include <sys/types.h>
#include <utime.h>
int utime(const char *filename,struct utimbuf *buf);
#include <sys/time.h>
int utime(char *filename,struct timeval *tvp);
struct utimbuf
{
time_t actime;
time_t modtime;
}
如果buf是一个空指针,则存取时间和修改时间都为当前时间。
成功返回0,错误范围-1
5. umake 设置文件创建时的屏蔽字,并返回以前的值
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);
6. rename 文件的移动和修改文件名
#include <stdio.h>
int rename(const char *oldpath, const char *newpath);
若newpath指定的文件已存在,则原文件会删除
7. remove 文件的删除
#include <unistd.h>
int unlink(const char *pathname);
int remove(const char *pathname);
文件的删除可以使用unlink系统调用,目录的删除需要使用rmdir系统调用,而通用的既能删除文件又能删除目录的系统调用是remove,remove内部封装了unlink和rmdir。
成功返回0,错位返回-1。
8. mkdir 目录的创建
#include <sys/types.h>
#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);
成功返回0,错位返回-1。
9. rmdir 目录的删除
#include <unistd.h>
int rmdir(const char *pathname);
rmdir只能删除空目录,成功返回0,错位返回-1。
10. getcwd 获取当前目录
#include <unistd.h>
char *gercwd(char *buf, size_t size);
char *get_current_dir_name(void);
char *getwd(char *buf);
getcwd会将当前的工作目录绝对路径复制到参数buf所指的内存空间,参数size为buf的空间大小。在调用此函数时,buf所指的内存空间要足够大,若工作目录绝对路径的字符串长度超过参数size大小,则返回值为NULL,errno的值为ERANGE。倘若参数buf为NULL,getcwd()会根据参数size的大小自动分配内存(使用malloc),如果size也为0,则getcwd()会根据工作目录绝对路径的字符串长度来决定配置的内存大小。进程可以在使用完此字符串后利用free()来释放空间。
执行成功则将结果复制到参数buff所指向的内存空间,或是返回自动分配的字符串指针,失败返回NULL.
11. chdir 设置工作目录
#include <unistd.h>
int chdir(const char *path);
int fchdir(int fd);
chdir将工作目录改为由path指定的目录,fchdir将工作目录改为由文件描述符fd指定的目录。
执行成功返回0,错误返回-1
12. 获取目录信息
1) opendir
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
opendir打开参数name指定的目录,并返回DIR*形态的目录刘,类似于文件描述符。成功返回目录流,失败返回NULL
2) readdir
#include <sys/types.h>
#include <dirent.h>
struct dirent *readdir(DIR *dir);
readdir用来从dir所指向的目录读取出目录的信息,返回一个struct dirent结构的指针。
struct dirent
{
long d_ino;//此目录i节点编号
off_t d_off;//目录文件开头至此目录进入点的位移
unsigned short d_reclen;//d_name的长度
char d_name[NAME_MAX+1];//以NULL结尾的文件名
}
函数执行成功范围该目录下一个文件的信息。如果用opendir打开某个目录,第一次调用该函数,则返回的是该目录下的第一个文件的信息。如果发生错误或者读到目录文件尾,返回NULL。
3) closedir
#include <sys/types.h>
#include <dirent.h>
int *closedir(DIR *dir);
关闭目录,成功返回0,失败返回-1
13. symlink建立符号链接
#include <unistd.h>
Int symlink(const char *actualpath, const char *sympath);
下面给出三个实例分别实现不同的函数功能:
1.改变进程的当前目录到指定的目录然后打印出该目录名
注意:改变的是当前进程的目录,并不修改父进程,所以当程序退出后,功能不变
/*改变进程的当前目录到指定的目录然后打印出该目录名。*/
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char path[1000];
if(argc!=2)
{
printf("Usage ex3-7 <pathname>\n");
return 1;
}
if(chdir(argv[1])<0)
{
printf("chdir failed\n");
return 2;
}
if(getwd(path)==NULL)
{
printf("getwd failed\n");
return 3;
}
printf("CWD =%s \n", path);
return 0;
}
2.创建一个目录,然后删除此目录
/*改变进程的当前目录到指定的目录然后打印出该目录名。*/
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char path[1000];
if(argc!=2)
{
printf("Usage ex3-7 <pathname>\n");
return 1;
}
if(chdir(argv[1])<0)
{
printf("chdir failed\n");
return 2;
}
if(getwd(path)==NULL)
{
printf("getwd failed\n");
return 3;
}
printf("CWD =%s \n", path);
return 0;
}
3.目录打开,读取和关闭函数的使用方法
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char path[1000];
DIR * dp;
struct dirent *pdirent;
if(argc!=2)
{
printf("Usage ex3-9 <pathname>\n");
return 1;
}
if((dp=opendir(argv[1]))==NULL)
{
printf("Opendir %s failed\n", argv[1]);
return 2;
}
if((pdirent=readdir(dp))==0)
{
printf("readdir %s failed\n", argv[1]);
return 3;
}
printf("%s\n",pdirent->d_name);
closedir(dp);
return 0;
}