2010-07-15 58 views
7

我们在单台计算机上运行我们的程序(c#)的多个实例。 在每个实例中,我们的代码尝试在方法Path.GetTempFile()的帮助下创建“许多”临时文件。 有时,我们的计划失败,出现异常:MultiProcessing中的Path.GetTempFileName

Exception: Access to the path is denied. 
StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.Path.GetTempFileName() 

我检查临时文件夹中,并没有发现一些奇怪的事情:可用磁盘就足够了,临时文件数量不是很大,等

我只有一个解释:一个实例获取临时文件并将其打开,但同时,另一个实例也获取临时文件的名称并尝试打开它。 如果它是正确的? 如果是,如何解决问题,如果不是如何理解什么问题?

UPD: 失败的计算机上Windows Server 2008的HPC

谢谢 伊戈尔。

Path
+0

不可能我想。如果'GetTempFileName'方法不是线程安全的,或者没有生成一个随机的名字,它就不会在那里。不是我知道确切的原因是什么...... – Noldorin 2010-07-15 12:35:39

+0

为了消除你认为可能的原因,只需在创建临时文件夹之前执行一个* if(Directory.Exists(myTempFolderName))* - 如果存在,然后生成一个新名字。 – slugster 2010-07-15 12:48:43

+0

你的意思是,使用Path.GetTempFileName()不是很好的做法吗? 如果方法不是“多线程或进程保存”我们该如何使用它? 当我需要特殊扩展名的临时文件夹时,我使用Guid生成唯一的文件名。 – constructor 2010-07-15 12:56:18

回答

4

msdn状态:

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

Furthermore有用于IO例外给出了两个原因:

  1. 的GetTempFileName方法将引发一个IOException如果使用不删除之前的临时文件创建超过65535个文件。

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

我建议你检查此条件(因为你明确说明您创建许多临时文件)。

+0

我检查了Windows临时文件夹。我在该文件夹中找不到超过1000个文件。在我们的例子中“很多”意味着当所有实例开始工作时,可能会有200-300个临时文件(全部)。 据我所知“线程安全”不等同于“多进程保存”。我们有几个实例(进程,而不是线程)。 – constructor 2010-07-15 12:52:31

相关问题