文件和目录的链接

链接以及基础知识

硬链接和软链接基本概念
硬链接类似于拷贝,但与源文件同步更新,权限、大小、时间值均与源
文件一样,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  阅读(375)  评论(0编辑  收藏  举报