gpt4 book ai didi

c - 如何使用文件描述符删除 C 中的文件?

转载 作者:行者123 更新时间:2023-12-03 09:53:45 25 4
gpt4 key购买 nike

在我的代码中,我使用 mkstemp() 函数创建了一个随机名称的文件(我在 Linux 上)。此函数返回的是一个 int,它是一个 文件描述符

int fd;
char temp[] = "tempXXXXXX";

fd = mkstemp(temp);

稍后我可以通过 int 文件描述符使用 fdopen() 访问该文件。

FILE *file_ptr = NULL;

file_ptr = fdopen(fd);

但在我的程序结束时,我想看看该文件是否仍然存在,并使用我创建它时给定的随机名称(如果成功,程序应该更改该文件名)。如果在该文件上运行的 rename() 函数成功,我可以设置一个标志,但是当我只有它的文件描述符时,我仍然不知道如何删除它。

if rename files => remove the temp file

我该怎么做?或者如果我有它的文件描述符,是否有办法获取文件名?

最佳答案

C 和 POSIX(因为您使用的是 POSIX 库函数)都没有定义通过打开的文件描述符删除文件的方法。这是有道理的,因为您所说的删除实际上是删除目录条目,而不是文件本身。同一个文件可以硬链接(hard link)到目录树的多个位置,具有多个名称。在指向它的最后一个硬链接(hard link)从目录树中删除并且不再有进程打开它之后,操作系统负责从存储中删除它的数据,或者至少将其标记为可重用。

文件描述符直接与文件相关联,而不是与任何特定路径相关联,尽管在许多情况下,您可以通过路径获得一个文件描述符。这有几个后果,其中一旦进程打开一个文件,就不能通过操纵目录树从它下面拉出该文件。这是解决问题的标准方法之一的基础:打开它后立即取消链接(删除),然后再丢失它的名字。示例:

#include <stdlib.h>
#include <unistd.h>

int make_temp_file() {
char filename[] = "my_temp_file_XXXXXX";
int fd;

fd = mkstemp(filename);
if (fd == -1) {
// handle failure to open ...
} else {
// file successfully opened, now unlink it
int result = unlink(filename);
// ... check for and handle error conditions ...
}

return fd;
}

这不仅(几乎)确保临时文件不会超过它的需要,而且还可以防止拥有进程未明确授予访问权限的用户和进程访问内容。

关于c - 如何使用文件描述符删除 C 中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64424287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com