免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1797 | 回复: 5
打印 上一主题 下一主题

pppk之Recipe7.11(2) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-27 21:30 |只看该作者 |倒序浏览
本帖最后由 zhuyubei 于 2012-08-27 21:49 编辑

上周5有些事,就没写。今天讲创建临时文件

上次我们讲了一个Template的概念,同样这个概念可以继续用在临时文件里。我们先复习下
  1. # Create a temp file
  2. my $sFileTemplate = "TestTempFileXXXX";
复制代码
最后连续的XXXX是随机的字符串。随机的字符串必须在最后,且至少4位,而前面的是固定的字符串,可以由用户指定。

临时文件的创建。要用到tempfile函数。用法和tempdir很类似。只是返回的不再只是目录或文件的名字
  1. # Get filehandle in scalar context, file will be deleted
  2. my $fhTmpFile = tempfile( $sFileTemplate,  DIR => $sTmpDir );
  3. print "FileHandle only: $fhTmpFile\n";
复制代码
我们这里试着用DIR参数来控制临时文件产生的目录。这里有个很重要的地方。在标量环境下,tempfile直接返回的是文件的句柄而不是文件名!这里未必要记住。


论坛徽章:
0
2 [报告]
发表于 2012-08-27 21:40 |只看该作者
那既然这里是文件句柄,而不是文件名。那在程序退出的时候,它会不会被删除呢? 答案是被删除了。而如果文件名字对用户很重要呢?比如说名字里面有进程号,或是某个运行时变量名怎么办呢?

这时候,你只要在列表环境下去调用tempfile这个函数. 在先前返回句柄的基础上,列表的第二个变量就接收了临时文件在绝对路径下的文件名。
  1. # Get filehandle and filename, file will be keep
  2. $sFileTemplate = "2222222FileXXXX";
  3. my ( $fhTmpFile, $sTmpFileName ) = tempfile( $sFileTemplate, DIR => $sTmpDir );
  4. print "FileName:$sTmpFileName\n";
  5. print $fhTmpFile "Test\n";# write something
  6. close ( $fhTmpFile ) or die "Can't close file $sTmpFileName:$!";
复制代码
我们这里试着对文件进行了写操作。注意在用列表环境下的tempfile,默认是不会删除临时文件的!我想库作者认为你既然要临时文件的名字了,也许会对该文件进一步操作。所以默认情况下,文件不被删除。

如果你在调试程序的时候要保留文件,就用列表环境下的赋值好了。

论坛徽章:
0
3 [报告]
发表于 2012-08-27 21:47 |只看该作者
但是如果你虽然需要临时文件名做一些后续处理,但是希望在程序退出的时候,为了节省硬盘空间,该文件又能被删除,那怎么办呢?
这时候,你可以在调用tempfile的时候指定其参数UNLINK为1。
  1. # Create temp file with more details
  2. $sFileTemplate = "3333333FileXXXX";
  3. # Specify extension and delete it always when program exits
  4. ( $fhTmpFile, $sTmpFileName )  =  tempfile( $sFileTemplate,   DIR => $sTmpDir,
  5.                                        SUFFIX => ".tmp", UNLINK => 1 ); # Not cleanup
复制代码
注意是UNLINK而不是CLEANUP。删除目录用CLEANUP,删除文件用UNLINK. 在指定UNLINK为1后,程序退出,临时文件就会被删除掉。

这里另一个参数SUFFIX也很有用,你可以指定临时文件名的后缀。这里我们把它当作后缀名来使用。在加了后缀之后,可以避免临时文件,被另一些进程当作正常的输入文件来处理。

所以创建临时文件主要问自己3个问题:
1. 需不需要用Template
2. 需不需要文件名
3. 需不需要被删除

论坛徽章:
0
4 [报告]
发表于 2012-08-27 22:03 |只看该作者
Python的临时文件创建主要是由tempfile来完成。

如果你不需要文件名(和默认的Perl类似),那可以调用tempfile.TemporayFile()
  1. noname = tempfile.TemporaryFile()
  2. noname.write("sdda")
  3. noname.seek(0)
  4. print noname.read()
复制代码
Perl里的无名文件句柄也可以这么用。

而如果你要文件名,那需要使用tempfile.NamedTemporaryFile(),然后调用其name属性,来查看文件名
  1. named = tempfile.NamedTemporaryFile();
  2. print named.name
复制代码
貌似这里临时文件在程序退出后,是被强制删除的。另外和上周讲得临时目录一样,该函数支持
  1. 'prefix', 'suffix', 'dir'
复制代码
之类的参数。这里就不多说了。

明天我们讲,文件锁。

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
5 [报告]
发表于 2012-08-28 15:46 |只看该作者
貌似有点坚持不住啊

论坛徽章:
0
6 [报告]
发表于 2012-08-28 15:50 |只看该作者
回复 5# cdtits


    哈哈。毕竟没这么简单。我一直尝试自己实践,而不是照搬书里的代码。所以会有些累
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP