2010-07-15 4 views
7

Programımızın (C#) birkaç örneğini tek bir bilgisayarda çalıştırıyoruz. Her durumda kodumuz, Path.GetTempFile() yönteminin yardımıyla "çok sayıda" geçici dosya oluşturmaya çalışır. Ben geçici klasörü kontrol edilip garip bir şey bulamadık Path.GetTempFileName

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

: boş disk yeterlidir, geçici dosya sayısı çok büyük değil, vs.

ben Ve bazen, program haricinde başarısız sadece bir açıklaması vardır: bir örnek geçici dosya alır ve açar, ancak aynı zamanda, başka bir örnek de geçici dosyanın adını alır ve açmaya çalışır. Doğruysa? Evet ise, sorunun nasıl çözüleceği, nasıl bir problemin nasıl anlaşılacağı değil mi?

UPD: Windows Server

teşekkür ederiz 2008 HPC, Igor ile bilgisayarda başarısız oldu. Path sınıf için

+0

Muhtemelen sanmıyorum. "GetTempFileName" yöntemi iş parçacığı güvenli değilse veya iyi rastgele bir ad oluşturmadıysa, orada olmaz. Tam sebebin ne olduğunu bildiğimden değil ... – Noldorin

+0

Neden olduğunu düşündüğünüz şeyi ortadan kaldırmak için, geçici bir klasör oluşturmadan önce bir * if (Directory.Exists (myTempFolderName)) * yapın - varsa yeni isim. – slugster

+0

Yani, Path.GetTempFileName() kullanmak iyi bir uygulama değil mi? Yöntem "çoklu iş parçacığı veya işlem kaydetme" yöntemini kullanarak nasıl kullanabiliriz? Özel bir uzantıya sahip geçici bir klasöre ihtiyacım olduğunda, benzersiz dosya adı oluşturmak için Guid kullanıyorum. – constructor

cevap

4

msdn devletler:

bu tip üyelerinin (Visual Basic'te Shared) tüm genel statik parçacığı için güvenlidir.

Furthermore IO istisnalar için verilen iki nedeni vardır:

  1. önceki geçici dosyaları silmeden fazla 65535 dosyaları oluşturmak için kullanıldığı takdirde bir IOException yükseltecektir GetTempFileName yöntemi. Benzersiz bir geçici dosya adı yoksa, GetTempFileName yöntemi bir IOException öğesini yükseltecektir. Bu hatayı gidermek için, tüm gereksiz geçici dosyaları silin.

I (açıkça size birçok geçici dosyaları oluşturmak ifade beri) bu koşullar için kontrol öneriyoruz.

+0

Windows geçici klasörünü kontrol ettim. Klasörde 1000'den fazla dosya bulamadım.Bizim örneğimizde "Birçok", tüm örnekler çalışmaya başladığında belki 200-300 geçici dosyaları (tamamen) anlamına gelir. "İş parçacığı güvenliğini" anladığım gibi "çoklu işlem kaydetme" ye eşdeğer değil. birkaç örneğimiz var (süreçler, thread değil). – constructor