我如何强制删除C中的文件?

时间:2015-09-18 21:47:28

标签: c linux

如何在linux中删除已打开的文件?

在shell中,我可以这样做:

rm -rf /path/to/file_or_directory

但我怎么能用C做呢?

我不想使用system()函数。

我看过unlink和remove方法,但它没有任何标记来设置强制删除。

4 个答案:

答案 0 :(得分:5)

unlinkremove函数强制删除。 rm命令在调用其中一个函数之前进行额外的检查。但是一旦你回答y,它就会使用该函数来完成实际工作。

答案 1 :(得分:1)

好吧,我希望这能回答你的问题..这个程序在当前目录中搜索文件名,你必须添加打开不同目录的功能,这应该不会太难...我不明白你的问题的最后一行,你能详细说明吗?但是删除和取消链接不需要标记(强制删除)......

#include<stdio.h>

int main()
{
   int status;
   char file_name[25];

   printf("Enter the name of file you wish to delete\n");
   fgets(file_name,25,stdin);

   status = remove(file_name);

   if( status == 0 )
      printf("%s file deleted successfully.\n",file_name);
   else
   {
      printf("Unable to delete the file\n");
      perror("Error");
   }

   return 0;
}

答案 2 :(得分:1)

要执行递归删除,您必须编写一个执行文件系统遍历的中等复杂程序。 ISO C没有库功能;它需要特定于平台的函数来递归地扫描目录结构。

在POSIX系统上,您可以使用opendirreaddirclosedir遍历各个目录,并使用编程语言递归来处理子目录。函数ftw及其较新的变体nwft执行封装的文件系统遍历;你只需提供一个回调函数来处理访问过的路径。 nftw更好,因为它有flags参数,您可以使用该参数指定FTW_DEPTH标志来首先执行搜索深度:在报告目录之前访问目录的内容。当然,这就是你想要的递归删除。

在MS Windows上,有FindFirstFileFindNextFile来组织递归遍历。

关于-f,它仅限制rm程序执行的某些检查,超出了操作系统的要求。如果不删除-f,则会提示您是否要删除只读文件,但实际上,在类Unix系统中,只有目录写入权限与文件的写入权限相关,才能删除。 remove库函数没有这样的检查。

顺便说一句,remove在ISO C中,因此它与平台无关。在POSIX系统上,它为目录调用rmdir,为其他对象调用unlink。所以remove不仅是便携式的,而且让您不必担心您要删除的内容类型。如果要删除目录,则必须为空。 (不是remove函数本身的要求,而是支持它的主流操作系统的要求。)

答案 3 :(得分:0)

removeunlink基本上等同于rm -f - 也就是说,它会在不提示输入的情况下删除指定的项目。

如果您想要等同于rm -r的内容,则需要编写遍历目录结构并单独删除项目的代码。 Boost Filesystem(例如)有一些代码可以让您在保持代码合理可移植性的同时相当简单。