在多进程中使用 Path.GetTempFileName

9
我们在单台计算机上运行多个程序实例(使用C#编写)。在每个实例中,我们的代码尝试使用Path.GetTempFile()方法创建“许多”临时文件。但有时,我们的程序会因为异常而失败:
Exception: Access to the path is denied.
StackTrace:    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.Path.GetTempFileName()

我检查了临时文件夹,没有发现什么奇怪的东西:剩余磁盘空间足够,临时文件数量也不是很多等等。
我只有一个解释:一个实例获取了临时文件并打开了它,但同时,另一个实例也获取了同样的临时文件名称并试图打开它。 如果这是正确的? 如果是,如何解决这个问题?如果不是,如何理解这个问题?
更新: 在安装了Windows Server 2008 HPC的计算机上失败。
谢谢, Igor.

我认为不太可能。如果GetTempFileName方法不是线程安全的或者不能生成良好随机化的名称,它就不会存在了。虽然我不知道确切的原因是什么... - Noldorin
在创建临时文件夹之前,只需要*if(Directory.Exists(myTempFolderName))*来排除你认为可能是原因的问题- 如果它存在,则生成一个新名称。 - slugster
你的意思是说,使用 Path.GetTempFileName() 不是一个好的做法吗? 如果这个方法不是“多线程或进程安全”的,我们该如何使用它?当我需要带有特殊扩展名的临时文件夹时,我使用 Guid 来生成唯一的文件名。 - constructor
这是一个操作系统问题,您需要记录使用的操作系统版本。如果是Windows 7:是的,它有毛病。 - Hans Passant
在安装Windows Server 2008 HPC的计算机上失败。 - constructor
我相信GetTempFileName只是调用了Win32等效函数,因此我希望它在不同的操作系统版本之间是相同或相似的。 - Rushyo
2个回答

6

MSDN中关于Path类的说明:

该类型的任何公共静态成员(在Visual Basic中为Shared)都是线程安全的。

此外,有两个原因会导致IO异常:

  1. 如果使用GetTempFileName方法创建超过65535个文件且未删除之前的临时文件,则会引发IOException。

  2. 如果没有可用的唯一临时文件名,则GetTempFileName方法将引发IOException。要解决此错误,请删除所有不需要的临时文件。

我建议检查这些条件(因为你明确指出你创建了很多临时文件)。


我检查了Windows临时文件夹,但在该文件夹中没有找到超过1000个文件。在我们的情况下,“许多”意味着当所有实例开始工作时,可能会有200-300个临时文件(总共)。据我所知,“线程安全”并不等同于“多进程安全”。我们有几个实例(进程,而非线程)。 - constructor


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接