如何在Linux中删除已打开的文件?
在shell中可以使用以下命令:
rm -rf /path/to/file_or_directory
但是我该如何在C语言中实现呢?
我不想使用system()
函数。
我已经看过了unlink和remove方法,但它们没有任何标志可以设置强制删除。
unlink
和remove
函数可以强制删除文件。在调用这些函数前,rm
命令会进行额外的检查。y
确认后,rm
命令将使用这些函数执行实际工作。
opendir
, readdir
和 closedir
来遍历单个目录,并使用编程语言递归处理子目录。函数 ftw
及其较新的变体 nwft
执行封装的文件系统遍历;您只需提供回调函数以处理访问的路径。 nftw
更好,因为它具有 flags
参数,您可以使用该参数指定 FTW_DEPTH
标志以进行深度优先搜索:在报告目录之前访问目录的内容。当然,这正是您想要进行递归删除的内容。 FindFirstFile
和 FindNextFile
可用于组合递归遍历。-f
,它仅抑制了rm
程序超出操作系统要求的某些检查。如果没有 -f
,您将被提示是否要删除只读文件,但实际上,在类 Unix 系统中,只有目录写入权限与文件删除有关, 而不是文件自身的权限。remove
库函数没有这样的检查。remove
在ISO C中,因此它是跨平台的。在POSIX系统上,它为目录调用rmdir
,对于其他对象则调用unlink
。因此,remove
不仅具有可移植性,而且让您无需担心正在删除的东西的类型。但要注意,如果要删除的是目录,则该目录必须为空。(这不是remove
函数本身的要求,而是主流支持它的操作系统的要求)。#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;
}
remove
或unlink
基本上等同于rm -f
--也就是说,它会在不提示进一步输入的情况下删除指定的项目。
如果你想要类似于rm -r
的东西,你需要编写代码来遍历目录结构并逐个删除项目。Boost Filesystem(例如)有代码可以让你相当简单地做到这一点,同时保持代码相对可移植性。
rm
命令的-f
参数可以禁止提示(并且忽略不存在的文件)。unlink
和remove
函数没有提示,而且对待不存在的文件也有所区别。基本上,它们总是强制删除,不需要其他标志。 - Kninnug