文件和文件夹(2)

link、ulink、remove和rename函数

#include <unistd.h>

int link(const char *oldpath, const char*newpath);

int unlink(const char *pathname);

 

#include <stdio.h>

int remove(const char *pathname);

int rename(const char *oldpath, const char*newpath);

 

link函数用于创建一个指向现有文件的硬链接。

unlink函数用于删除一个现有的文件夹项。假设一个文件的链接数降低到0,而且没有进程打开它。这个文件就被删除。实际情况是,文件夹项总是被先删除,但文件所占用的孔家要等到最后一个进程关闭它之后才会被系统回收。

remove函数能够解除对一个文件或文件夹的链接。对于文件。其功能与unlink同样。对于文件夹,其功能与rmdir同样。

rename更改文件或文件夹的名字。

符号链接

符号链接又称为链接,是指向文件的间接指针。

引入符号链接的原因是为了避免硬链接的一些限制:

1.      硬链接通常要求链接和文件位于同一问价系统中

2.      仅仅有超级用于才干创建指向文件夹的硬链接

当引用以名字引用文件的函数时。应当了解该函数是否尾随链接到达它所链接的文件。

下面是硬链接和符号链接之间的差别:

硬链接:仅仅能引用同一文件系统中的文件。它引用的是文件在文件系统中的物理索引(也称为 inode)。当您移动或删除原始文件时,硬链接不会被破坏,由于它所引用的是文件的物理数据而不是文件在文件结构中的位置。硬链接的文件不须要用户有訪问原始文件的权限,也不会显示原始文件的位置。这样有助于文件的安全。假设您删除的文件有对应的硬链接,那么这个文件依旧会保留,直到全部对它的引用都被删除。

符号链接:是一个指针,指向文件在文件系统中的位置。符号链接能够跨文件系统,甚至能够指向远程文件系统中的文件。符号链接仅仅是指明了原始文件的位置。用户须要对原始文件的位置有訪问权限才干够使用链接。假设原始文件被删除。全部指向它的符号链接也就都被破坏了。

它们会指向文件系统中并不存在的一个位置。两种链接都能够通过命令 ln 来创建。ln 默认创建的是硬链接。使用 -s 开关能够创建符号链接。

符号链接与硬链接有什么差别?

简单的说:硬连接记录的是目标的 inode,符号连接记录的是目标的 path。

symlink和readlink函数

#include <unistd.h>

int symlink(const char *oldpath, const char*newpath);

ssize_t readlink(const char *path, char*buf, size_t bufsiz);

symlink创建一个符号链接。

该函数创建一个指向oldpath的新文件夹项newpath,在创建符号连接时,并不要求oldpath已经存在。而且oldpath和newpath并不须要位于同一文件系统中。

由于open函数尾随符号链接,所以须要一种方法打开该链接本身。并读该链接中的名字。readlink提供这样的功能。此函数成功运行,返回读到的字节数。在buf中返回符号的内容不以null字符终止。综合了open、read和close的全部操作。

文件的时间

对每一个文件都保持有三个时间字段

st_atime           文件数据的最后訪问时间

st_mtime                   文件数据的最后改动时间

st_ctime           i节点状态的最后更改时间

改动时间和更改状态时间之间的差别:改动时间时文件内容最后一次被改动的时间。

更改状态时间是该文件的i节点最后一次被改动的时间。

系统不保存对i节点的最后一次訪问时间,所以access和stat等函数并不更改这三个时间中的不论什么一个。

ls命令按这三个时间值中的一个排序进行显示。按系统默认按文件的改动时间先后排序。-u选项使其按訪问时间顺序排序,-c选项使其按更改状态时间排序。

utime函数

#include <sys/types.h>

#include <utime.h>

int utime(const char *filename, const structutimbuf *times);

utime能够更改一个文件的訪问和改动时间。

The utimbuf structure is:

          struct utimbuf {

               time_t actime;       /* access time */

               time_t modtime;      /* modification time */

          };

mkdir和rmdir函数

#include <sys/stat.h>

#include <sys/types.h>

 

int mkdir(const char *pathname, mode_tmode);

mkdir用于创建一个新的空文件夹。所指定的文件訪问权限mode有进程的文件模式创建屏蔽字改动。

#include <unistd.h>

int rmdir(const char *pathname);

rmdir删除一个空文件夹。

读文件夹

#include <sys/types.h>

#include <dirent.h>

DIR *opendir(const char *name);

opendir打开一个文件夹并建立一个文件夹流,成功返回DIR指针的结构指针。该指针用于读取文件夹数据项,失败返回空指针。

 

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

该函数返回一个指针,指针指向的结构里保存着文件夹流dirp中的下一个文件夹项的有关资料。

后序的readdir调用将返回后序的文件夹项。

调用失败返货NULL。

struct dirent结构包括的文件夹数据项内容包括下面部分:

ino_t d_ino:      文件的inode节点号

char d_name[]:         文件的名字

 

#include <sys/types.h>

#include <dirent.h>

int close(int fd);

该函数关闭一个文件夹流并释放与之关联的资源。

成功返回0,失败返回-1。

 

include <dirent.h>

long telldir(DIR *dirp);

该函数的返回值记录一个文件夹流里的当前位置。

 

#include <dirent.h>

void seekdir(DIR *dirp, long offset);

该函数设置文件夹流dirp的文件夹项指针。

DIR结构是一个内部结构,上述函数用这个内部结构保存当前正被读的文件夹的有信息。

 

chdir、fchdir和getcwd函数

#include <unistd.h>

int chdir(const char *path);

int fchdir(int fd);

程序能够像用户在文件系统里漫游那样来游览文件夹。

就像我们在shell里使用cd命令来切换文件夹一样,在程序里则能够使用chdir或fchdir系统调用。

#include <unistd.h>

char *getcwd(char *buf, size_t size);

getcwd函数把当前文件夹的名字写到给定缓冲区buf里。假设文件夹的名字超出了參数size给出的缓冲区长度,它就返回NULL。假设成功,它返回指针buf。