使用unlink删除文件

时间:2013-02-28 21:51:57

标签: c linux binaryfiles unlink

我想读取命令行参数中给出的文件,并在读取后将其删除。这就是我正在做的事情。

char *filename = argv[1];
char *outputfile = strcat(argv[1], ".cmp");

fd = open(argv[1], O_RDONLY);
chars = read(fd, buf, BUFFERSIZE);
fd1 = creat(outputfile, 0644);
write(fd1, buf, BUFFERSIZE);
close(fd1);
close(fd);
unlink(argv[1]);

如果我在命令行中输入“mytxt”,代码应该创建“mytxt.cmp”文件并删除“mytxt”,而不是删除“mytxt.cmp”,保持“mytxt”不变。为什么会这样?如何删除命令行参数中给出的文件。

2 个答案:

答案 0 :(得分:5)

char *outputfile = strcat(argv[1], ".cmp");

您正在修改argv[1]filename指向它。您可以尝试使用mallocsprintf创建一个新字符串 - 将所需值添加到其中。

char *newstr = malloc(strlen(argv[1]) + strlen(".cmp") + 1);
sprintf(newstr, "%s.cmp", argv[1]);

答案 1 :(得分:4)

这不好,是导致问题的原因:

char *outputfile = strcat(argv[1], ".cmp");

这是做什么的:

1)将“.cmp”附加到argv [1]。不要这样做!您不知道argv [1]指向的缓冲区中有多少空间,因此可能会覆盖/损坏其他一些数据。 2)strcat返回一个指向连接字符串的指针,该字符串只是argv [1],最后危险地添加了“.cmp”。 strcat 为新字符串分配空间。 3)所以你真正做的是将“.cmp”附加到原始文件中,因此argv[1]outputfile都指向相同的字符串,并且可能损坏了一些内存。

您应该做的是为字符串分配空间:

char* outputfile = (char*)(malloc(strlen(argv[1]) + strlen(".cmp") + 1));
sprintf(outputfile, "%s.cmp", argv[1]);

然后在最后给回记忆。

free(outputfile);