比如构建的以下命令行:
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