How can I copy a file on Unix using C?

前端 未结 8 703
说谎
说谎 2020-11-27 12:39

I\'m looking for the Unix equivalent of Win32\'s CopyFile, I don\'t want to reinvent the wheel by writing my own version.

8条回答
  •  Happy的楠姐
    2020-11-27 12:45

    There is no need to either call non-portable APIs like sendfile, or shell out to external utilities. The same method that worked back in the 70s still works now:

    #include 
    #include 
    #include 
    
    int cp(const char *to, const char *from)
    {
        int fd_to, fd_from;
        char buf[4096];
        ssize_t nread;
        int saved_errno;
    
        fd_from = open(from, O_RDONLY);
        if (fd_from < 0)
            return -1;
    
        fd_to = open(to, O_WRONLY | O_CREAT | O_EXCL, 0666);
        if (fd_to < 0)
            goto out_error;
    
        while (nread = read(fd_from, buf, sizeof buf), nread > 0)
        {
            char *out_ptr = buf;
            ssize_t nwritten;
    
            do {
                nwritten = write(fd_to, out_ptr, nread);
    
                if (nwritten >= 0)
                {
                    nread -= nwritten;
                    out_ptr += nwritten;
                }
                else if (errno != EINTR)
                {
                    goto out_error;
                }
            } while (nread > 0);
        }
    
        if (nread == 0)
        {
            if (close(fd_to) < 0)
            {
                fd_to = -1;
                goto out_error;
            }
            close(fd_from);
    
            /* Success! */
            return 0;
        }
    
      out_error:
        saved_errno = errno;
    
        close(fd_from);
        if (fd_to >= 0)
            close(fd_to);
    
        errno = saved_errno;
        return -1;
    }
    

提交回复
热议问题