|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
: X1 O) J- n# x使用临时文件要考虑几个问题:
9 S" U8 b7 |, E9 \. w' J, V9 |, U$ v5 k
- 保证临时文件间的文件名不互助冲突。
- 保证临时文件中内容不被其他用户或者黑客偷看、删除和修改。
; F8 _$ p8 y( w# ]$ }* P L, ]
+ R- v2 @! ]; ?' ?( HLinux中提供了mkstemp 和 tmpfile 函数来处理临时文件。
6 p: o! c/ T# e( Q# D8 C M% z' D. h0 a0 r" \0 I
mkstemp函数& m3 `# E, O6 W! [, s8 r* U
, L: E/ b& A" r- N- u/ q- X2 hint mkstemp(char *template);) x' ], m1 o$ r1 Z
mkstemp函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证了文件名的唯一性。 函数返回一个文件描述符,如果执行失败返回-1。在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666,glibc 2.0.7以后的库这个文件的访问权限是0600。
# ~0 K) \7 t$ |. u3 {& Z. v( P
! m2 l: l( K( X- V0 D, J# i e临时文件使用完成后应及时删除,否则临时文件目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除,所以执行完mkstemp函数后要调用unlink函数,unlink函数删除文件的目录入口,但临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。
o" |0 l M6 o' S
: ?6 F [0 [; c$ c* B#include <stdio.h>4 u/ [0 s |8 B
#include <string.h>9 Q" |2 r' t% h* |9 F
#include <unistd.h>% g# m. Q$ Q# ?
#include <stdlib.h>9 {. J$ h( H$ p" U) }+ J" L* @. m
# K, @8 R! c/ K# \; o/ L6 a
int write_temp_file(char* buffer,size_t length) {) e# P# f6 B! ] a8 R I2 Z& _( o
int len=length; H/ |0 q$ \2 p) S, y2 J
char filename_template[]="/tmp/temp_file.XXXXXX";
/ Z$ {8 G' [, p7 A Q3 i int fd=mkstemp(filename_template);
V, x( t& s, j' q1 g o. e unlink(filename_template);//Unlink the file, so it'll be removed when close
O, W! U9 e2 j9 ?3 } printf("Template file name:%s\n",filename_template);
' H/ |0 F y& H+ ]/ f write(fd,&len,sizeof(len));2 I1 `! E: r1 _7 Y) ]& C
write(fd,buffer,len);
! g5 C" Q1 E; v+ p2 R return fd;* y5 Y4 p* w. U4 @: P& ~. x) I
}) O4 T. ^; x7 c9 x& T8 B/ r/ P3 p
( }6 X! q& J: d2 d5 Dchar* read_temp_file(int fd, size_t* length) {6 f+ }8 P4 b; p- ]0 s* J
char* buffer;* j2 G2 q3 Y1 x! O
lseek(fd,0,SEEK_SET);; @$ P/ p) d7 _! x" ^( A
read(fd,length,sizeof(size_t));! P$ P0 u7 x7 s, Y" `
buffer=(char*)malloc(*length);
7 m" b' c) T* y ~0 R$ ^ read(fd,buffer,*length);0 a- z" v6 K4 E+ Y7 S# t
close(fd); // Temp file will be deleted
6 I7 H" |- N6 i; n return buffer;9 N3 s5 i: @/ B
}
/ `9 R0 v. [$ x+ \( S1 g& i& f( M
$ |! R0 K% i2 K5 P9 uint main(int argc, char** argv) {
4 W' J. o5 a0 t char buffer[]="Test template files";
9 q) t& i+ n! h& F int fd=write_temp_file(buffer,strlen(buffer));! K, K7 z3 n/ y7 a8 Q( [& _& r
int len=0;$ K+ b9 r1 o0 z. x8 \9 {% q
char* result=read_temp_file(fd,&len);. a, a6 X, l: k2 J9 ?1 a
printf("Len:%d\nContent:%s\n",len,result);
^% f _# o6 N, @' h% I free(result);
1 q8 r- E+ P1 B W* X return 0;+ ?# ~7 Y5 z- m/ |3 \
}
+ k+ p6 d$ ^4 M7 U2 d. O* f1 a8 ^; |9 `5 p
tmpfile函数
. }4 _( L. T+ D7 W4 ]7 U
$ g3 f: M1 _# j, b, B如果您使用C library I/O函数,并且并没有另一个程序使用这个临时文件,有个更简洁的函数——tmpfile。tmpfile函数创建并打开一个临时文件,并且自动执行了unlink。tmpfile函数返回一个文件描述符,如果执行失败返回NULL。当程序执行了fclose或者退出时,资源被释放。$ @) i+ Y1 ?9 t/ R7 ]7 S: [" O, I0 M
2 v' ?1 H3 W: L另外,linux系统中还提供mktemp、 tmpnam、 和tempnam等函数,但是由于健壮性和安全性的问题,不建议使用。 |
|