如何获取临时文件名?

18

我看到了一些与我的问题相关的帖子,但没有一个完全解决它。 我需要在标准临时目录中创建一个文件,并在写入完成后将其移动到另一个位置。 这个想法是,在下载过程中该文件被视为临时文件,在下载完成后它变成永久文件。

我尝试通过调用mkstemptmpfile来实现这一点,然后在完成写入后调用rename。 然而,我需要文件的完整路径才能调用rename,而从文件描述符(由mkstemp返回)或FILE *(由tmpfile返回)获取文件名似乎并不是一个简单的过程。 它可以做到,但并不优雅。

是否有一个系统调用会创建一个临时文件并提供给我名称? 我知道关于mktemp和相关调用,但它们要么不能保证唯一性,要么已经被弃用。 或者也许有更好的方法来创建、写入和移动临时文件。

1个回答

20

看起来 mkstemp 实际上是正确的选择。

int fd;
char name[] = "/tmp/fileXXXXXX";
fd = mkstemp(name);
/* Check fd. */
在这个调用之后,你会在fd中得到一个有效的描述符,并在name中得到相关文件的名称。

1
你说得对,我需要更仔细地阅读文档。虽然有点强迫症,但我使用了这篇帖子中的信息来获取临时文件夹,而不是简单地硬编码“/tmp”。 - jorgander
如果您正在/tmp/中创建文件,然后计划将文件移动到特定位置,比如"/home/<user>/",那么复制或移动文件将需要很长时间,如果/tmp和/home/位于不同的分区区域,则情况会更糟;因此最好在/home/<user>/fileXXXXX中创建文件,然后将其重命名为/home/<user>/file。 - Viswesn
最终文件名是什么? - Don Scott
1
@DonScott 请再看一遍答案:“以及相关文件的名称在name中”。 - cnicutar

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