C复制/移动文件的应用程序&;在Linux中使用系统调用

C复制/移动文件的应用程序&;在Linux中使用系统调用,c,linux,C,Linux,在我的C代码中,我很难通过系统调用来解除文件的链接。我想在复制代码后从文件系统中删除该文件。我收到一个错误,上面写着: declared here extern int unlink (const char *__name) __THROW __nonnull ((1)); #包括 #包括 #包括 #包括 int main(int argc,char*args[] { 内填充,外填充; 国际货币基金组织; 字符缓冲区[20]; infle=open(参数[1],仅限O_rdo,0700); i

在我的C代码中,我很难通过系统调用来解除文件的链接。我想在复制代码后从文件系统中删除该文件。我收到一个错误,上面写着:

declared here extern int unlink (const char *__name) __THROW __nonnull ((1));
#包括
#包括
#包括
#包括
int main(int argc,char*args[]
{
内填充,外填充;
国际货币基金组织;
字符缓冲区[20];
infle=open(参数[1],仅限O_rdo,0700);
if(infle==enoint)
{
printf(“找不到文件”);
返回1;
}
outfile==open(args[2],O_WRONLY | O_CREAT,0700);
而((numobytesread=read(infle,buffer,20))){
写入(输出文件、缓冲区、numobytesread);
}
关闭(填充);
关闭(输出文件);
取消链接();
返回0;
}

复制后,您可以调用
取消链接
系统调用

unlink(args[1])
但在删除文件之前,请确保检查复制是否成功


Ref:

如果您要做的只是调用unlink来删除文件,这应该可以工作,因为
unlink
会占用一个文件路径。因此,如果您的输入文件路径是有效的,并且在文件系统中不是只读的,这应该可以工作。我已经测试过了,它对我有效。它将第一个参数指定的文件复制到第二个参数指定的文件,然后删除输入文件。我还修复了您的错误处理

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

int main(int argc, char *args[]) {
    int infile, outfile, readcnt;
    char buffer[20];

    if ((infile = open(args[1], O_RDONLY, 0700)) < 0) {
        perror("Error openning input file");
        return -1;
    }

    if ((outfile = open(args[2], O_WRONLY | O_CREAT, 0700)) < 0) {
        perror("Error opening output file");
        return -1;
    }

    while ((readcnt = read(infile, buffer, 20)) > 0) {
         if (write(outfile, buffer, readcnt) < 1) {
            perror("Error writing to output file");
            return -1;
         }
    }

    close(infile);
    close(outfile);

    if (unlink(args[1]) < 0) {
        perror("Error unlinking file");
        return -1;
    }

    return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,char*args[]{
int-infle、outfile、readcnt;
字符缓冲区[20];
如果((infle=open(args[1],orduonly,0700))<0){
perror(“打开输入文件时出错”);
返回-1;
}
如果((outfile=open(args[2],O|u WRONLY | O|u CREAT,0700))<0){
perror(“打开输出文件时出错”);
返回-1;
}
而((readcnt=read(infle,buffer,20))>0){
if(写入(输出文件、缓冲区、读CNT)<1){
perror(“写入输出文件时出错”);
返回-1;
}
}
关闭(填充);
关闭(输出文件);
如果(取消链接(参数[1])<0){
perror(“错误解除文件链接”);
返回-1;
}
返回0;
}

请复制并粘贴文本格式的代码,并将其包含在帖子中。不要链接图像。您没有解释您遇到的问题。是否只添加取消链接(旧文件)?不要使用JPEG截图,它们看起来很难看。使用PNG代替。(这是一个一般性的建议。但是最好是发布文本而不是图像。)您的代码有什么问题?请不要用评论来回答,这会影响你的问题。并确定你是使用C还是C++。这有助于错误的问题,谢谢!我还有一个问题。有没有办法在代码中实现cp cmd,使其只执行copy cmd,然后在复制完成后删除/取消链接?因此,我需要做的唯一一件事就是运行./filename file1 file2?@compma:在文件必须跨文件系统移动的情况下,
mv
命令已经做到了这一点(它只是正确地保留了权限)。你为什么要重新发明轮子?非常感谢你。。。这可能是一个愚蠢的问题,但retval做什么呢?有没有办法在代码中实现cp cmd,使其只执行copy cmd,然后在复制完成后删除/取消链接?因此,我只需要运行./filename file1 file2?系统调用通常返回-1以指示错误,并将errno设置为错误原因(数字代码)。您可以像以前一样将事情与错误原因进行比较,但如果您确实不需要出于特定原因执行特定操作,并且任何失败都是致命的,只需执行
peror()
并退出,它就会打印错误的人/文本原因。retval捕获返回状态。
read()和
write()`返回-1表示错误,如果写入或读取了字节,则返回正值。请参阅@compma I出于习惯添加了retval more。只有在使用返回值(比如readcnt)执行某些操作时,才需要它,否则应该忽略它。所以我编辑了答案以删除它。上次更新-我应该在每次perror()之后返回。我也修好了。
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>

int main(int argc, char *args[]) {
    int infile, outfile, readcnt;
    char buffer[20];

    if ((infile = open(args[1], O_RDONLY, 0700)) < 0) {
        perror("Error openning input file");
        return -1;
    }

    if ((outfile = open(args[2], O_WRONLY | O_CREAT, 0700)) < 0) {
        perror("Error opening output file");
        return -1;
    }

    while ((readcnt = read(infile, buffer, 20)) > 0) {
         if (write(outfile, buffer, readcnt) < 1) {
            perror("Error writing to output file");
            return -1;
         }
    }

    close(infile);
    close(outfile);

    if (unlink(args[1]) < 0) {
        perror("Error unlinking file");
        return -1;
    }

    return 0;
}