2013-03-08 72 views
1

我在linux服务器上运行C++的代码。在代码中,我使用功能unlink(filename)来删除文件。由代码本身生成的临时文件正在成功删除。但是我手动放入的文件,我的代码无法删除它们。可能是什么原因?在linux上强制删除一个使用C++的文件

+1

“我的代码无法删除它们” - 当您列出目录内容时是否还能看到文件名?或者你是否仅仅观察到光盘空间仍然被分配而不被回收? – 2013-03-08 11:42:30

+0

我不熟悉那个函数,但它可能是文件权限的问题。 – SamGamgee 2013-03-08 11:43:12

+0

@安德里亚斯:是的。即使在执行代码后,这些文件仍然存在。 – sajal 2013-03-08 11:47:23

回答

9

试试这个:

#include <errno.h> 
#include <string.h> 

...

if (unlink(filename) == -1) { 
    fprintf(stderr, "File '%s' unlink error (%d): %s\n", filename, errno, strerror(errno)); 
    // or just use perror("unlink") for less customizable error message 
    // note: calling other functions before printing may change errno value 
} 

产生的错误信息应该透露的问题是什么。

这里的errno man pageunlink man page会告诉它可以返回什么错误。


嗯,因为这实际上是一个C++的问题,你可以和可能应std::cerr取代fprintf,但在这种情况下,它可能有必要先做int errtmp = errno和使用,为避免的iostream搞乱它在它被检查之前。

如果您想明确表示它是顶级命名空间中的符号,那么您至少也可以编写::unlink(filename),至少有些人甚至在没有必要时也会考虑这种良好实践。

+0

非常感谢@hyde这样一个提示和美妙的解决方案。我是一个白痴,只是通过文件名而不是完整的路径,以防手动放置文件。错误消息解决了我的问题。再次感谢。 :) – sajal 2013-03-08 12:04:13

+0

@sajal没问题。增加了一些关于C++的细节,因为我的解决方案更像C代码。 – hyde 2013-03-08 12:08:23

+0

而不是使用fprintf,我将输出重定向到日志文件,所以我很安全:) – sajal 2013-03-08 12:23:19

1

,对于例如rm -f作品中,如果文件中有保护,不允许删除它,它会尝试更改文件保护和所有权,使用chmod()chown()功能,“有可能的方式删除文件“。如果用户是root或者文件实际上属于运行程序的用户,那么这只能保证能够正常工作。

请注意,这会变得与系统有关,您无法编写更改文件权限等的代码,这种代码可以在Windows和类Unix操作系统上运行,如果您想要这样做,比如说Symbian OS,这将是如何做到的第三个变体。尽管在某些情况下可能会出现“Posix兼容”chmod()

+0

'rm -f'不会尝试更改权限;它只是压制一些提示和错误报告。但是,C++ 17提供了'std :: filesystem'(基于Boost,natch),可以让你操纵权限。 – 2017-10-04 07:07:14

相关问题