2011-07-13 156 views
0

我有一个奇怪的问题......我想我已经缩小到了使用Page.GetTempFileName()创建临时文件的程度。可以Path.GetTempFileName()永远缓存吗?

我有时会得到一个错误信息,说明Cannot create a file when that file already exists.

是否有机会使用Path.GetTempFilename()可以产生相同的文件名,并成为高速缓存?

我改变我的代码使用方法:

Path.Combine(System.IO.Path.GetTempPath(), string.Concat(Guid.NewGuid().ToString(), ".xls")); 

在希望,这将产生一个唯一的文件名,但我担心的是,同样的问题可能出现。

回答

2

Path.GetTempFilename()在磁盘上创建一个实际的文件;取决于你在做什么,一旦你有这个文件名,你可能会触发一些东西。它被写为返回实际文件以避免与过去较旧的临时文件名方法相关的竞争条件(例如C标准库中的tmpnam)。

请注意,如果超过65,535个,它将引发异常使用此方法创建的文件而不删除它们,或者它不能生成唯一的文件名。

那么,在你从Path.GetTempFilename()中取回它后,你用那个文件名做什么?

+0

我们使用SyncFusion库从返回的一些数据生成Excel(xls)文件。所以我们将文件从'.tmp'移动到'.xls',然后使用'SaveAs'写入文件。一旦我们完成,我们通常会删除文件。有时候,这种情况不会发生...... –

+0

那么这个调用只会验证这个名字没有与.tmp扩展名一起使用。当你重命名它时,你是否首先检查你是否已经有一个带有.xls这个名字的文件?当这种情况失败时,临时目录中有多少个文件(并且在此之后会一直失败,或者只是偶尔?) – Joe

+0

它只是偶尔。所以它可能会重用现有的文件名,因为它不存在作为一个tmp ...有趣的。我希望上面提到的有关使用GUID创建文件的更改。我甚至添加了一个while循环来检查文件是否存在,如果它确实是安全的,请重新生成一个新名称。 –