2010-07-15 2 views
7

мы запускаем несколько экземпляров нашей программы (C#) на одном компьютере. В каждом случае наш код пытается создать «много» временных файлов с помощью метода Path.GetTempFile(). А иногда, наша программа завершается с исключением:Path.GetTempFileName в MultiProcessing

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

Я проверил временную папку и не нашел что-то странное: свободный диск достаточно, количество временных файлов не очень большое, и т.д.

I имеют только одно объяснение: один экземпляр получает временный файл и открывает его, но в то же время другой экземпляр также получает имя временного файла и пытается его открыть. Если это так? Если да, то как решить проблему, если нет, то как понять, в чем проблема?

UPD: не удалось на компьютере с Windows Server 2008 HPC

Спасибо, Игорь.

+0

Скорее всего, я думаю. Если метод GetTempFileName не был потокобезопасным или не генерировал хорошо рандомизированное имя, его там не было. Не то, чтобы я знаю, какова точная причина ... – Noldorin

+0

Чтобы устранить то, что, по вашему мнению, может быть причиной, просто сделайте * if (Directory.Exists (myTempFolderName)) * перед созданием временной папки - если она существует, новое имя. – slugster

+0

Вы имеете в виду, что использовать Path.GetTempFileName() неправдоподобно? Если метод не «многопоточность или процесс сохранения», как мы можем его использовать? , когда мне нужна временная папка со специальным расширением, я использую Guid для генерации уникального имени файла. – constructor

ответ

4

msdn состояния для Path класса:

Любые открытые (Shared в Visual Basic) члены этого типа являются потокобезопасными.

Furthermore есть две причины, приведенные для исключения ввода-вывода:

  1. Метод GetTempFileName возбудит IOException, если он используется для создания более 65535 файлов без удаления предыдущих временных файлов.

  2. Метод GetTempFileName повысит исключение IOException, если нет уникального временного имени файла. Чтобы устранить эту ошибку, удалите все ненужные временные файлы.

Я рекомендовал бы проверить для этого условия (так как вы явно указать, что вы создаете много временных файлов).

+0

Я проверил временную папку Windows. Я не нашел более 1000 файлов в папке.«Многие» в нашем случае это означает, что 200-300 временных файлов (полностью), когда все экземпляры начинают работать. Как я понимаю, «потокобезопасность» не эквивалентна «multi process save». у нас есть несколько экземпляров (процессы, а не потоки). – constructor