文件和目录的链接

链接以及基础知识

• 硬链接和软链接基本概念
– 硬链接类似于拷贝,但与源文件同步更新,权限、大小、时间值均与源
文件一样,inode也与源文件相同
• inode和block
– inode存文件属性
– block存文件数据
• 使用ln命令可以创建链接

 

硬链接link

• 硬链接命令为ln,函数为link
• man 2 link
• 硬链接函数
• int link(const char *oldpath, const char *newpath);
– 参数*oldpath:已有的文件路径。
– 参数*newpath:新建的硬链接文件路径。
– 返回值:成功返回0,错误返回-1。
• 编写编译运行测试

#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
        int ret;

        if(argc < 3) {
                printf("Please input file path\n");
                return 1;
        }

        ret = link(argv[1], argv[2]);
        if(ret < 0) {
                printf("%s link %s failed.\n", argv[1], argv[2]);
                return 1;
        }
        printf("%s link %s success\n", argv[1], argv[2]);

        return 0;
}

 

符号链接symlink

• 符号链接也叫软链接,symlink
• man 2 symlink
• 软链接函数
• int symlink(const char *oldpath, const char *newpath);
– 参数*oldpath:已有的文件路径
– 参数*newpath:新建的符号链接文件路径
– 返回值:成功返回0,错误返回-1
• 编写编译运行测试
– 和link对比测试

#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
        int ret;

        if(argc < 3) {
                printf("Please input two path\n");
                return 1;
        }

        ret = symlink(argv[1], argv[2]);
        if(ret < 0) {
                printf("symlink failed.\n");
                return 1;
        }

        printf("%s symlink %s success.\n", argv[1], argv[2]);

        return 0;
}

 

解除链接unlink

• man 2 unlink
• 解除链接函数
• int unlink(const char *pathname);
– 参数*pathname:链接文件的路径
– 返回值:成功返回0,错误返回-1
– unlink指向软链接,删除软链接;指向最后一个硬链接,相当于删除文件
• 编写编译运行测试

#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
        int ret;
        if(argc < 2) {
                printf("Please input path\n");
                return 1;
        }

        ret = unlink(argv[1]);
        if(ret < 0) {
                printf("unlink failed.\n");
                return 1;
        }
        printf("unlink %s success.\n", argv[1]);

        return 0;
}

 

拷贝文件

• Linux 下并没有专门的拷贝函数和接口,需要通过open,read,wite 等文件操作函数实现。
• 拷贝流程图

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

#define LENGTH 1024

int main(int argc, char *argv[])
{
        int ret, fileNew, fileOld;
        char buf[LENGTH];
        if(argc < 3) {
                printf("Please input two path.\n");
                return 1;
        }

        fileOld = open(argv[1], O_RDWR|O_NOCTTY|O_NDELAY);
        if(fileOld < 0) {
                printf("open %s failed.\n", argv[1]);
                return 1;
        }

        fileNew = open(argv[2], O_WRONLY|O_CREAT, 0644);
        if(fileNew < 0) {
                printf("open %s failed\n", argv[2]);
                return 1;
        }

        while(read(fileOld, buf, LENGTH)) {
                write(fileNew, buf, strlen(buf));
        }

        close(fileOld);
        close(fileNew);

        printf("cp to finished!\n");
        printf("cp %s to %s success!\n", argv[1], argv[2]);

        return 0;
}

 

 

移动文件命令为mv,函数为rename

• man 2 rename
• int rename(const char *oldpath, const char *newpath)
– 参数*oldpath:旧的文件路径
– 参数*newpath:新的文件路径
– 返回值:成功返回0,错误返回-1
• 编写编译运行测试

#include <stdio.h>

int main(int argc, char *argv[])
{
        int ret;
        if(argc < 3) {
                printf("Please input two path\n");
                return 1;
        }

        ret = rename(argv[1], argv[2]);
        if(ret < 0) {
                printf("rename failed.\n");
                return 1;
        }

        printf("rename %s to %s success\n", argv[1], argv[2]);
        return 0;
}

 

posted @ 2018-08-02 14:13  习惯就好233  阅读(426)  评论(0)    收藏  举报