`

临时文件创建函数

阅读更多
    ISO C 标准库提供了两个函数以帮助创建临时文件。
#include <stdio.h>
char *tmpnam(char *ptr);    /* 返回值:指向唯一路径名的指针 */
FILE *tmpfile(void);     /* 返回值:若成功,返回文件指针;否则,返回 NULL */

    tmpnam 函数产生一个与现有文件名不同的一个有效路径名字符串,其最多调用次数由 <stdio.h> 中的 TMP_MAX 来指定。若 ptr 是 NULL,则产生的路径名存放在一个静态区中,指向该静态区的指针作为函数值返回。后续再调用 tmpname 时会重写该静态区,这意味着如果调用此函数多次,而且想保存路径名,则应该保存路径名的副本,而非指针的副本。若 ptr 不是 NULL,则认为它应该是指向至少 L_tmpnam(在 <stdio.h> 中)个字符的数组。注意,该函数在 SUSv4 中被标记为弃用,但 ISO C 标准仍继续支持。
    tmpfile 创建一个临时二进制文件(类型为 wb+),在关闭该文件或程序结束时将自动删除这种文件。该函数经常使用的标准 UNIX 技术是先调用 tmpnam 产生一个唯一的路径名,然后再用该路径名创建一个文件,并立即 unlink 它。因为对一个文件解除链接并不删除其内容,要关闭该文件时才会,而关闭文件可以是显式的,也可以在程序终止时自动进行。
    下列程序说明了这两个函数的应用。
#include <stdio.h>
#include <stdlib.h>

#define MAXLINE 4096

int main(void){
	char name[L_tmpnam], line[MAXLINE];
	FILE *fp;

	printf("%s\n", tmpnam(NULL));         // first temp name
	tmpnam(name);             // second temp name
	printf("%s\n", name);
	
	if((fp=tmpfile()) == NULL){
		printf("tmpfile error\n");
		exit(1);
	}
	fputs("one line of output\n", fp);
	rewind(fp);              // read ti back
	if(fgets(line, sizeof(line), fp) == NULL){
		printf("fgets error\n");
		exit(1);
	}
	fputs(line, stdout);
    exit(0);
}

    运行结果如下:
$ ./tempfileDemo.out
/tmp/fileTOHsu6
/tmp/filekmAsYQ
one line of output

    Single UNIX Specification 扩展中为处理临时文件定义了下面另外两个函数,它们是 XSI 的扩展部分。
#include <stdlib.h>
char *mkdtemp(char *template);  /* 返回值:若成功,返回指向目录名的指针;否则,返回 NULL */
int mkstemp(char *template);  /* 返回值:若成功,返回文件描述符;否则,返回 -1 */

    mkdtemp 使用权限集“S_IRUSR|S_IWUSR|S_IXUSR”创建了一个具有唯一名字的目录。而 mkstemp 创建一个具有唯一名字的文件,并以权限集“S_IRUSR|S_IWUSR”打开该文件,另外也不会自动删除该文件。这两个函数都是通过 template 字符串来创建目录或文件的,该字符串是后 6 位设置为“XXXXXX”的路径名,函数将这些占位符替换成不同的字符串来构建一个唯一的路径名。如果成功,这两个函数都将修改 template 字符串以反映临时文件的名字。
    mkstemp 函数使用示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>

void make_temp(char *template);

int main(void){
	char	good_template[] = "/tmp/dirXXXXXX";		// right way
	char	*bad_tempfile = "/temp/dirXXXXXX";		// wrong way

	printf("trying to create first temp file...\n");
	make_temp(good_template);
	printf("trying to create seconde temp file...\n");
	make_temp(bad_tempfile);
	exit(0);
}

void make_temp(char *template){
	int	fd;
	struct stat	sbuf;

	if((fd=mkstemp(template)) < 0){
		printf("can't create temp file");
		return;
	}
	printf("temp name = %s\n", template);
	close(fd);
	if(stat(template, &sbuf) < 0){
		if(errno == ENOENT)
			printf("file doesn't exist\n");
		else
			printf("stat failed\n");
	}else{
		printf("file exists\n");
		unlink(template);
	}
}

    运行结果示例:
$ ./mkstempDemo.out 
trying to create first temp file...
temp name = /tmp/dir0wPp4L
file exists
trying to create seconde temp file...
段错误 (core dumped)
$ 

    两个模板字符串声明方式的不同带来了不同的运行结果。因为第一个模板使用了数组,名字是在栈上分配的。但第二个使用了指针,此时只有指针自身驻留在栈上。编译器把字符串存放在可执行文件的只读段,当 mkstemp 函数试图修改该字符串时,就会出现段错误。
分享到:
评论

相关推荐

    C++如何创建临时文件

    在C++编程中,创建临时文件是一个常见的需求...在实际项目中,结合具体场景选择合适的临时文件创建方式,既能保证程序的安全性,又能提高效率。在提供的压缩包"Demo"中,可能包含了上述示例代码的实现,供学习和参考。

    VB 制作临时文件

    - 或者,使用`System.IO.Path.GetTempFileName()`函数,它会自动为临时文件生成一个唯一的文件名,包括完整的路径。例如: ```vb Dim tempFileName As String = System.IO.Path.GetTempFileName() Dim file As ...

    vc创建临时文件的例子

    为了创建一个临时文件,我们需要使用`CFile::Open`函数的特定模式。以下是一个简单的例子: ```cpp #include int main() { CFileStatus status; if (!CFile::GetStatus(_T("NUL"), status)) // 使用"NUL"获取...

    在linux系统下使用C语言操作临时文件

    mkstemp 函数是 Linux 系统下处理临时文件的专门函数,该函数将在系统中以独一无二的文件名创建一个文件并打开,然后只有当前用户才有访问这个临时文件的权限,当前用户对这个临时文件可以打开并进行读、写操作。...

    创建临时文件

    在IT行业中,创建临时文件是一项常见的任务,尤其在软件开发、数据处理以及系统管理中扮演着重要角色。...在进行跨平台开发时,理解不同操作系统下的临时文件创建机制至关重要,以确保代码的兼容性和可靠性。

    PHP 文件操作函数

    PHP的`move_uploaded_file()`函数用于处理表单提交的文件上传,确保安全地将临时文件移动到指定位置。`$_FILES`全局数组包含了上传文件的相关信息。 6. **文件处理类** 自PHP 5起,引入了SPL(Standard ...

    精彩编程与编程技巧-创建临时文件...

    ### Visual Basic中的临时文件创建方法 Visual Basic作为一种高级编程语言,提供了多种途径来创建临时文件,其中最常用的是通过调用Windows API函数`GetTempFileName`。此函数允许用户指定文件的前缀和目录,返回一...

    linux临时文件建立代码

    tmpnam和tmpfile函数是C标准库中用于生成和打开临时文件的函数,它们分别适用于不同的场景,并且有各自的特点和使用注意事项。 tmpnam函数的原型为: ```c char *tmpnam(char *s); ``` tmpnam函数返回一个与系统中...

    自动查找并删除VC生成的临时文件

    你可以编写一个批处理脚本,通过特定的规则(如文件扩展名或文件创建时间)来筛选临时文件,并设定排除列表以避免删除关键文件。此外,也可以使用如CCleaner这样的第三方工具,它们通常会智能识别并清理各种开发工具...

    临时文件分析帮你了解编程

    临时文件的创建: 1. **程序运行需求**:许多程序在运行时需要额外的空间来存储中间计算结果或配置信息,尤其是在大型应用中。例如,安装程序可能会创建临时文件来保存配置信息或用于解压下载的安装包。 2. **内存...

    Delphi系统临时文件操作示例源码..rar

    1. **临时文件创建**:在Delphi中,可以使用`System.IOUtils.TFile.CreateTempFile`方法来创建一个临时文件。这个方法会返回一个临时文件的完整路径,可供后续的读写操作使用。 2. **文件路径管理**:了解如何处理...

    易语言源码易语言临时文件清理源码.rar

    3. 条件判断:源码中会包含判断语句,用于判断文件是否为临时文件,例如通过文件的创建时间、文件大小或文件名来确定。 4. 错误处理:在清理过程中,可能会遇到权限问题或其他异常,源码中应包含错误处理机制,确保...

    C# 文件下载写入临时文件带进度条的哦

    使用`System.IO`命名空间中的类,如`System.IO.Path.GetTempFileName()`方法创建一个临时文件,这将返回一个唯一的临时文件名。然后,可以使用`FileStream`或`File.WriteAllText()`将下载的文件内容写入这个临时...

    用来查找并删除vc编辑器所生成的一些临时文件源代码

    - 避免版本冲突:不同版本的编译器可能创建相同名称的临时文件,清理旧文件可避免混淆。 3. **手动清理方法**: - 手动定位并删除:通过文件浏览器找到并删除无用的临时文件。 - 使用IDE的清理功能:大部分IDE...

    计算机软件-商业源码-224 创建临时文件.zip

    6. **Go**:`os.CreateTemp()`函数可以创建临时文件,它返回一个`*os.File`对象,以及一个错误。 无论使用哪种语言,创建临时文件时都需要注意一些最佳实践。例如,应始终确保在不再需要临时文件时删除它,避免占用...

    临时中转文件

    - 文件系统操作:在操作系统层面,可以使用`fopen`, `fwrite`, `fclose`等函数来创建、写入和关闭临时文件。 - 缓存技术:内存缓存如Redis、Memcached也可以作为临时数据存储,但当数据量较大时,文件系统可能更为...

    Delphi获得临时文件目录..rar

    总结,Delphi通过`GetTempPath`函数获取临时文件目录,是开发过程中处理临时文件的基础。理解并正确使用临时文件目录,可以提升程序的稳定性和效率。同时,注意跨平台兼容性和安全性的考量,是编写高质量Delphi应用...

    c语言文件操作函数总结

    - `tmpfile()`:创建临时文件。 - `tmpnam()`:生成临时文件名。 10. **文件的权限和属性**: - 这些功能通常不在C标准库中提供,而是依赖于操作系统API,如Unix的`chmod()`和`stat()`函数。 理解并熟练运用...

    获取临时文件目录的位置

    在计算机系统中,临时文件目录是一个非常重要的概念,它用于存储程序运行时产生的临时数据,这些数据通常是短时间内创建、使用并被删除的。临时文件目录的位置因操作系统而异,但通常都有一个标准的路径供开发者访问...

Global site tag (gtag.js) - Google Analytics