如何在linux中删除已打开的文件?
在shell中,我可以这样做:
rm -rf /path/to/file_or_directory
但我怎么能用C做呢?
我不想使用system()函数。
我看过unlink和remove方法,但它没有任何标记来设置强制删除。
答案 0 :(得分:5)
unlink
和remove
函数强制删除。 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系统上,您可以使用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
函数本身的要求,而是支持它的主流操作系统的要求。)
答案 3 :(得分:0)
remove
或unlink
基本上等同于rm -f
- 也就是说,它会在不提示输入的情况下删除指定的项目。
如果您想要等同于rm -r
的内容,则需要编写遍历目录结构并单独删除项目的代码。 Boost Filesystem(例如)有一些代码可以让您在保持代码合理可移植性的同时相当简单。