如何在C语言中强制删除文件?

3

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

在shell中可以使用以下命令:

rm -rf /path/to/file_or_directory

但是我该如何在C语言中实现呢?

我不想使用system()函数。

我已经看过了unlink和remove方法,但它们没有任何标志可以设置强制删除。


1
rm 命令的 -f 参数可以禁止提示(并且忽略不存在的文件)。unlinkremove 函数没有提示,而且对待不存在的文件也有所区别。基本上,它们总是强制删除,不需要其他标志。 - Kninnug
可能是如何在C程序中删除文件?的重复问题。 - jww
4个回答

7

unlinkremove函数可以强制删除文件。在调用这些函数前,rm命令会进行额外的检查。y确认后,rm命令将使用这些函数执行实际工作。


1
要执行递归删除,您需要编写一个相当复杂的程序来执行文件系统遍历。ISO C没有此类库功能;扫描目录结构需要特定于平台的函数。
在POSIX系统上,您可以使用 opendir readdir closedir 来遍历单个目录,并使用编程语言递归处理子目录。函数 ftw 及其较新的变体 nwft 执行封装的文件系统遍历;您只需提供回调函数以处理访问的路径。 nftw 更好,因为它具有 flags 参数,您可以使用该参数指定 FTW_DEPTH 标志以进行深度优先搜索:在报告目录之前访问目录的内容。当然,这正是您想要进行递归删除的内容。
在MS Windows上,有 FindFirstFile FindNextFile 可用于组合递归遍历。
关于 -f,它仅抑制了rm程序超出操作系统要求的某些检查。如果没有 -f ,您将被提示是否要删除只读文件,但实际上,在类 Unix 系统中,只有目录写入权限与文件删除有关, 而不是文件自身的权限。remove库函数没有这样的检查。
顺便说一下,remove在ISO C中,因此它是跨平台的。在POSIX系统上,它为目录调用rmdir,对于其他对象则调用unlink。因此,remove不仅具有可移植性,而且让您无需担心正在删除的东西的类型。但要注意,如果要删除的是目录,则该目录必须为空。(这不是remove函数本身的要求,而是主流支持它的操作系统的要求)。

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
不要使用 gets!同时声明 main 函数的返回值类型为 int - Kninnug
@Kninnug 感谢您指出这个问题,我写得太快了!再次感谢! - LearningCODE
离能够评论只差5个声望点,就快了:D - LearningCODE

0

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

如果你想要类似于rm -r的东西,你需要编写代码来遍历目录结构并逐个删除项目。Boost Filesystem(例如)有代码可以让你相当简单地做到这一点,同时保持代码相对可移植性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接