2010-11-19 23 views
1

dosyaya yazmadan önce:Dosya erişimi sorunu

using (StreamWriter outfile = new StreamWriter(filePath, false, System.Text.Encoding.UTF8)) 
{ 
    outfile.Write(content);    
} 

ben dosya yazma kontrol ediyorum bu kullanarak accsses: fonksiyonu üzerinde olmasına rağmen

public bool CheckIfAccessToFileIsGranted(string filePath) 
{ 
    try 
    { 
     new FileIOPermission(FileIOPermissionAccess.Write, filePath).Demand(); 
     return true; 
    } 
    catch (SecurityException) 
    { 
     return false; 
    } 
} 

bana değerlendirmek verir (true döndürür) Akışı açarken UnauthorizedAccessException alıyorum. Niye ya ?

Selamlar

cevap

6

Buradaki sorun Dosya Sistemi İzinleri ile Kod Erişim Güvenliği (CAS) karıştırıyorsunuz olduğunu. Birincisi, sadece CLR süreçleri için geçerli olan bir kısıtlama iken, ikincisi işletim sistemi düzeyinde bir kısıtlamadır. Bu iki güvenlik yöntemi birbirinden bağımsızdır (dosya sistemi bilgileri CAS politikasına katkıda bulunabilir).

Bu durumda, UnauthorizedAcessException dosya sisteminde izin eksikliğini temsil eder, ancak çalışmayacak olan CAS denetimi ile korumaya çalışıyorsunuz. Dosya sistemi düzeyinde (CAS hariç), bir işlemin doğrulanmaya çalışılmasının elden önce gerçekleştirileceği veya başarılı olamayacağı pratiği gerçekten boşunadır. Bunu yapmak için hiçbir yol yoktur, çünkü pek çok dış varlık, dosya sistemini kontrol etme ve erişme girişimi arasında değiştirebilir. Sadece dosyayı denemek ve erişmek ve başarısız erişimden kaynaklanan istisnayı yakalamak çok daha güvenilirdir.

İşte sadece bunu yapmayın bu konuda

+1

+1 sadece son cümle için ... –

4

yazdı detaylı blog yazısı bir bağlantı. JaredPar'ın bu davada neden çalışmadığına dair doğru cevabı olsa da, son cümlesini genişletmek istiyorum: tüm egzersiz boş.

Dosya sistemi izinleri uçucu'dir. Uygulama kodunuzdan tamamen bağımsız şekillerde bir andan diğerine geçiş yapabilirler ve bu, izinleri kontrol ettiğinizde ve dosyaya yazmaya çalıştığınızda aradaki anı içerir. Ve izinler sık ​​sık değişmezken, bu kritik dönemde dosya bile silinebilir veya yeniden adlandırılabilir.

Önemli olan, küçükken, bu küçük pencerede gerçekleşen bir şeyin olasılığının yeterince yüksek olması, bu kod için iyi istisna işleyicisi oluşturmaya zaman ayırmanız gerektiğidir. Ve bunu yaptıktan sonra, tüm bu çalışmayı kontrol ettiniz, dosya izinleri aniden kararsızlaşıyor. Başka bir deyişle, bir dosyaya yazma izniniz olup olmadığını görmenin doğru yolu, aslında dosyaya yazmayı deneyin.