1. 苏葳的备忘录首页
  2. 编程

Path.GetTempFileName()的问题及替代函数

c# GetTempFileName项目内需要生成压缩文件,考虑到winrar的流行,何不直接调用rar压缩算法解决问题?研究之下才发现,rar的压缩算法是受到版权保护的,解压缩倒是随便。也罢,用系统调用rar.exe来生成文件问题也不大吧。使用Path.GetTempFileName()来产生一个压缩的临时文件名,然后将此文件名传给rar.exe,搭上各种参数,构成命令行执行。然而执行时却始终报错:压缩文件名是无效的压缩文件。

比如构建的以下命令行:

rar a -ep -p123456 "C:\Documents and Settings\Administrator\Local Settings\Temp\tmpAnD.tmp" "C:\book.css"

此命令行意在将book.css压缩入系统临时文件目录的tmpAnd.tmp临时文件(由GetTempFileName()自动产生)。将此句单独复制在命令行窗口中执行,无问题。然而在程序中调用此命令行时,却一直报上面的错误。

后来研究文档才注意到,GetTempFileName()函数是创建该临时文件空文件后,再返回该文件名。换句话说,返回文件名后,文件已经存在磁盘上了。而此时,rar a 命令发现目标压缩文件存在时,采用的是添加方式,即将目标文件当作一个压缩文件,后来的文件添加进此压缩文伯。那么原临时空文件当然并非一个有效的压缩文件,报错也就难免。

那么处理起来就简单了,只采生一个不会重复的临时文件名,而不创建文件即可,剩下的都由rar处理就行。使用以下函数 即可满足需要:

Path.Combine(Path.GetTempPath(), DateTime.Now.Ticks.ToString() + "_" + Guid.NewGuid().ToString() + ".tmp")

首先取得系统临时文件目录。然后将此目录路径与DateTime.Now.Ticks以及Guid.NewGuid()组合起来。Guid.NewGuid值重复的机率大约是0.00000000006,再加上DateTime.Now.Ticks,已无重复的可能,比如上述规则产生的一个临时文件名C:\Documents and Settings\Administrator\Local Settings\Temp\635294420624434262_46363651-3e08-4072-a678-2104cf4492c4.tmp。重要的一点是,函数只会产生文件名,而不会创建文件。

另一个好处是,原GetTempFileName()函数一直有65535个文件的限制,即若创建超过这个数量的临时文件则会引发异常。而上述替代函数显然不存在这个问题。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/538.html

发表评论

邮箱地址不会被公开。 必填项已用*标注