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

时间:2017-01-30 01:28:04

标签: c linux

我很难进行系统调用以取消链接我的C代码中的文件工作。我希望在复制代码后从文件系统中删除该文件。我收到的错误是:

declared here extern int unlink (const char *__name) __THROW __nonnull ((1));
 #include <stdio.h>
 #include <unistd.h>
 #include <errno.h>
 #include <fcntl.h>
int main(int argc, char * args [])
{
    int infile, outfile;
    int numofbytesread;
    char buffer[20];

    infile = open(args[1], O_RDONLY, 0700);

    if (infile == ENOENT)
    {
            printf("Could not find file");
            return 1;
    }

    outfile == open(args[2], O_WRONLY | O_CREAT, 0700);

    while ((numofbytesread = read(infile, buffer, 20))){
            write(outfile, buffer, numofbytesread);
    }
    close(infile);
    close(outfile);

     unlink();
 return 0;
 }

2 个答案:

答案 0 :(得分:4)

复制后,您可以调用unlink系统调用。

unlink(args[1])

但请务必在删除文件之前检查副本是否成功。

参考:https://www.gnu.org/software/libc/manual/html_node/Deleting-Files.html

答案 1 :(得分:3)

如果你要做的就是调用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;
}