- 浏览: 140808 次
文章分类
最新评论
ISO C 标准库提供了两个函数以帮助创建临时文件。
tmpnam 函数产生一个与现有文件名不同的一个有效路径名字符串,其最多调用次数由 <stdio.h> 中的 TMP_MAX 来指定。若 ptr 是 NULL,则产生的路径名存放在一个静态区中,指向该静态区的指针作为函数值返回。后续再调用 tmpname 时会重写该静态区,这意味着如果调用此函数多次,而且想保存路径名,则应该保存路径名的副本,而非指针的副本。若 ptr 不是 NULL,则认为它应该是指向至少 L_tmpnam(在 <stdio.h> 中)个字符的数组。注意,该函数在 SUSv4 中被标记为弃用,但 ISO C 标准仍继续支持。
tmpfile 创建一个临时二进制文件(类型为 wb+),在关闭该文件或程序结束时将自动删除这种文件。该函数经常使用的标准 UNIX 技术是先调用 tmpnam 产生一个唯一的路径名,然后再用该路径名创建一个文件,并立即 unlink 它。因为对一个文件解除链接并不删除其内容,要关闭该文件时才会,而关闭文件可以是显式的,也可以在程序终止时自动进行。
下列程序说明了这两个函数的应用。
运行结果如下:
Single UNIX Specification 扩展中为处理临时文件定义了下面另外两个函数,它们是 XSI 的扩展部分。
mkdtemp 使用权限集“S_IRUSR|S_IWUSR|S_IXUSR”创建了一个具有唯一名字的目录。而 mkstemp 创建一个具有唯一名字的文件,并以权限集“S_IRUSR|S_IWUSR”打开该文件,另外也不会自动删除该文件。这两个函数都是通过 template 字符串来创建目录或文件的,该字符串是后 6 位设置为“XXXXXX”的路径名,函数将这些占位符替换成不同的字符串来构建一个唯一的路径名。如果成功,这两个函数都将修改 template 字符串以反映临时文件的名字。
mkstemp 函数使用示例:
运行结果示例:
两个模板字符串声明方式的不同带来了不同的运行结果。因为第一个模板使用了数组,名字是在栈上分配的。但第二个使用了指针,此时只有指针自身驻留在栈上。编译器把字符串存放在可执行文件的只读段,当 mkstemp 函数试图修改该字符串时,就会出现段错误。
#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 函数试图修改该字符串时,就会出现段错误。
发表评论
-
打开伪终端设备
2018-07-09 20:50 1248在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1533伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 791多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 937终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 566尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 933虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 706tcgetattr 和 tcsetattr ... -
终端特殊输入字符
2018-05-17 06:33 807终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 432终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 575在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 943在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 612在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 490消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 479有 3 种称作 XSI IPC ... -
IPC 通信之 FIFO
2018-02-06 22:55 412FIFO 也被称为命名管道,未命名的管道只能在两个相关 ... -
IPC 通信之管道
2018-01-30 22:22 383管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 878readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 449POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 584记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 432UNIX 系统中,守护进程遵循下列通用惯例。 ...
相关推荐
在C++编程中,创建临时文件是一个常见的需求...在实际项目中,结合具体场景选择合适的临时文件创建方式,既能保证程序的安全性,又能提高效率。在提供的压缩包"Demo"中,可能包含了上述示例代码的实现,供学习和参考。
- 或者,使用`System.IO.Path.GetTempFileName()`函数,它会自动为临时文件生成一个唯一的文件名,包括完整的路径。例如: ```vb Dim tempFileName As String = System.IO.Path.GetTempFileName() Dim file As ...
为了创建一个临时文件,我们需要使用`CFile::Open`函数的特定模式。以下是一个简单的例子: ```cpp #include int main() { CFileStatus status; if (!CFile::GetStatus(_T("NUL"), status)) // 使用"NUL"获取...
mkstemp 函数是 Linux 系统下处理临时文件的专门函数,该函数将在系统中以独一无二的文件名创建一个文件并打开,然后只有当前用户才有访问这个临时文件的权限,当前用户对这个临时文件可以打开并进行读、写操作。...
在IT行业中,创建临时文件是一项常见的任务,尤其在软件开发、数据处理以及系统管理中扮演着重要角色。...在进行跨平台开发时,理解不同操作系统下的临时文件创建机制至关重要,以确保代码的兼容性和可靠性。
PHP的`move_uploaded_file()`函数用于处理表单提交的文件上传,确保安全地将临时文件移动到指定位置。`$_FILES`全局数组包含了上传文件的相关信息。 6. **文件处理类** 自PHP 5起,引入了SPL(Standard ...
### Visual Basic中的临时文件创建方法 Visual Basic作为一种高级编程语言,提供了多种途径来创建临时文件,其中最常用的是通过调用Windows API函数`GetTempFileName`。此函数允许用户指定文件的前缀和目录,返回一...
tmpnam和tmpfile函数是C标准库中用于生成和打开临时文件的函数,它们分别适用于不同的场景,并且有各自的特点和使用注意事项。 tmpnam函数的原型为: ```c char *tmpnam(char *s); ``` tmpnam函数返回一个与系统中...
你可以编写一个批处理脚本,通过特定的规则(如文件扩展名或文件创建时间)来筛选临时文件,并设定排除列表以避免删除关键文件。此外,也可以使用如CCleaner这样的第三方工具,它们通常会智能识别并清理各种开发工具...
临时文件的创建: 1. **程序运行需求**:许多程序在运行时需要额外的空间来存储中间计算结果或配置信息,尤其是在大型应用中。例如,安装程序可能会创建临时文件来保存配置信息或用于解压下载的安装包。 2. **内存...
1. **临时文件创建**:在Delphi中,可以使用`System.IOUtils.TFile.CreateTempFile`方法来创建一个临时文件。这个方法会返回一个临时文件的完整路径,可供后续的读写操作使用。 2. **文件路径管理**:了解如何处理...
3. 条件判断:源码中会包含判断语句,用于判断文件是否为临时文件,例如通过文件的创建时间、文件大小或文件名来确定。 4. 错误处理:在清理过程中,可能会遇到权限问题或其他异常,源码中应包含错误处理机制,确保...
使用`System.IO`命名空间中的类,如`System.IO.Path.GetTempFileName()`方法创建一个临时文件,这将返回一个唯一的临时文件名。然后,可以使用`FileStream`或`File.WriteAllText()`将下载的文件内容写入这个临时...
- 避免版本冲突:不同版本的编译器可能创建相同名称的临时文件,清理旧文件可避免混淆。 3. **手动清理方法**: - 手动定位并删除:通过文件浏览器找到并删除无用的临时文件。 - 使用IDE的清理功能:大部分IDE...
6. **Go**:`os.CreateTemp()`函数可以创建临时文件,它返回一个`*os.File`对象,以及一个错误。 无论使用哪种语言,创建临时文件时都需要注意一些最佳实践。例如,应始终确保在不再需要临时文件时删除它,避免占用...
- 文件系统操作:在操作系统层面,可以使用`fopen`, `fwrite`, `fclose`等函数来创建、写入和关闭临时文件。 - 缓存技术:内存缓存如Redis、Memcached也可以作为临时数据存储,但当数据量较大时,文件系统可能更为...
总结,Delphi通过`GetTempPath`函数获取临时文件目录,是开发过程中处理临时文件的基础。理解并正确使用临时文件目录,可以提升程序的稳定性和效率。同时,注意跨平台兼容性和安全性的考量,是编写高质量Delphi应用...
- `tmpfile()`:创建临时文件。 - `tmpnam()`:生成临时文件名。 10. **文件的权限和属性**: - 这些功能通常不在C标准库中提供,而是依赖于操作系统API,如Unix的`chmod()`和`stat()`函数。 理解并熟练运用...
在计算机系统中,临时文件目录是一个非常重要的概念,它用于存储程序运行时产生的临时数据,这些数据通常是短时间内创建、使用并被删除的。临时文件目录的位置因操作系统而异,但通常都有一个标准的路径供开发者访问...