2010-10-05 15 views
15

kullanarak bir dizin özniteliği salt okunur Çıkarma: main.cs olarakBen yalnızca aşağıdaki kod parçacığını kullanarak bir dosya üzerinde özniteliği okumak kaldırmak başarıyla başardı C#

FileSystemInfo[] sqlParentFileSystemInfo = dirInfo.GetFileSystemInfos(); 

foreach (var childFolderOrFile in sqlParentFileSystemInfo) 
{ 
    RemoveReadOnlyFlag(childFolderOrFile); 
} 

private static void RemoveReadOnlyFlag(FileSystemInfo fileSystemInfo) 
{ 
    fileSystemInfo.Attributes = FileAttributes.Normal; 
    var di = fileSystemInfo as DirectoryInfo; 

    if (di != null) 
    { 
     foreach (var dirInfo in di.GetFileSystemInfos()) 
      RemoveReadOnlyFlag(dirInfo); 
    } 
} 

Maalesef bu kokan Klasörler üzerinde çalışıyorum. Ben klasöre gittiğinizde kodu çalıştırdıktan sonra, sağ tıklayıp özellikleri yapmak, burada gördüğüm budur: o altındaki dosyalardan kaldırmasıyla rağmen

alt text

salt okunur bayrağı hala kontrol edilir. Bu, bu klasörün silinmesi işleminin başarısız olmasına neden olur. Bayrağı el ile kaldırdığımda ve işlemi (bir yarasa dosyası) yeniden yürüttüğümde, dosyayı silebilir (bu yüzden bu dosyanın yarasa dosyasıyla ilgili bir sorun olmadığını biliyorum)

Bu bayrağı C# ile nasıl kaldırabilirim?

cevap

8

Ayrıca Belirtilen üst dizin içindeki tüm dizinleri ve dosyalar için aşağıdaki yinelemeli net ReadOnly (ve arşive vs.) gibi bir şey yapabileceğini

public void Main() 
{ 
    DirectoryInfo parentDirectoryInfo = new DirectoryInfo(@"c:\test"); 
    ClearReadOnly(parentDirectoryInfo); 
} 
6

orijinal dirInfo üzerine dosyaları-

foreach (string fileName in System.IO.Directory.GetFiles(@"c:\temp\content")) 
{ 
    System.IO.FileInfo fileInfo = new System.IO.FileInfo(fileName); 
    fileInfo.Attributes = FileAttributes.Normal; 
} 
+0

Bu dizinde çalışıyor gibi görünmüyor. Ben hala readonly set ile özellikleri görüyorum. – DotnetDude

1

üzerinde Attributes özelliğini ayarlayın attrbutes temizlemek için yerine Fileinfo

ait
DirectoryInfo di = new DirectoryInfo(@"c:\temp\content"); 
di.Attributes = FileAttributes.Normal; 

DirectoryInfo deneyin:

dirInfo.Attributes = FileAttributes.Normal; 

FileSystemInfo[] sqlParentFileSystemInfo = dirInfo.GetFileSystemInfos(); 

foreach (var childFolderOrFile in sqlParentFileSystemInfo) 
{ 
    RemoveReadOnlyFlag(childFolderOrFile); 
} 
+0

Çalışmıyor. Kabuk sınıfı hakkındaki tüm kaynak kodları – DotnetDude

3

iletişim Sadece çalışır oldukça garip bir şekilde. Her zaman, ReadOnly özniteliğinin durumu ne olursa olsun, ekran görüntüsünde gördüğünüz şekli gösterir. Onay kutusu 'belirsiz' durumda. Tıklamanız ve eylemini gerçekleştirmesi için temizlemeniz veya kontrol etmeniz gerekir. Ve istemi metnine rağmen (ancak onay kutusunun yanındaki ipucu değil), yalnızca dizindeki dosyaların ReadOnly özniteliğini değiştirir, dizinin kendisi değil.

Gerçekten neler olup bittiğini görmek için, attrib komut satırı komutunu kullanın. Herhalde, kodunuz, ReadOnly öznitelikleri kümesine sahip olan dosyaları içerdiğinden başarısız olur. Onları tekrarlamak zorundasın.

private void ClearReadOnly(DirectoryInfo parentDirectory) 
{ 
    if(parentDirectory != null) 
    { 
     parentDirectory.Attributes = FileAttributes.Normal; 
     foreach (FileInfo fi in parentDirectory.GetFiles()) 
     { 
      fi.Attributes = FileAttributes.Normal; 
     } 
     foreach (DirectoryInfo di in parentDirectory.GetDirectories()) 
     { 
      ClearReadOnly(di); 
     } 
    } 
} 

Bu nedenle şöyle bu çağırabilirsiniz:

0

Görüyorum ki @DotnetDude, erkeklerin çözümlerinin işe yaramadığı yorumlarında. Zihnime göre, çocuklar yeni özellikler uygulamak için File.SetAttributes yöntemini kullanmanın gerekliliğinden bahsetmiyorlar.

-1
Shell("net share sharefolder=c:\sharefolder/GRANT:Everyone,FULL") 


Shell("net share sharefolder= c:\sharefolder/G:Everyone:F /SPEC B") 


Shell("Icacls C:\sharefolder/grant Everyone:F /inheritance:e /T") 


Shell("attrib -r +s C:\\sharefolder\*.* /s /d", AppWinStyle.Hide) 

bu kod iznini her biri bu sonradan karşısında olur Ne olur ne

+0

'intezermined' durumundaki readonly bayrağıyla hala görüyor musunuz? – Kiquenet

+0

@Kiquenet, 'Shell' bir sınıf değil; Bu bir VB.NET işlevi. C# 'da, benzer bir davranış için Process.Start()' ı kullanabilirsiniz (başka bir işlemden başlayarak.) Daha fazla bilgi için 'Process' ve' ProcessStartInfo' sınıflarının belgelerine bakın. Orijinal soru olarak sadece rağmen, Salt Okunur özelliğini kapatarak amacıyla , Mark Avenius' cevabını kullanarak yerine yeni bir süreç başlıyor öneriyoruz. – reirab

1

...

TÜM okuma ile her birine bir klasörü paylaşmak ve yazma .. benim için çalışıyor Benimkiden önce gönderilen diğer cevaplar ya yanlıştır ya da gereksiz özyineleme kullanır.Pencerelerin mülkiyet iletişim kutusundaki tüm "Salt Okunur" onay kutusunun

Öncelikle her zaman klasörler için üç-durumlu bir işaret bulunmaz. Bunun nedeni, klasörün salt okunur değil, içindeki dosyalar da olabilir. Eğer ayarlamak isterseniz

/unset TÜM dosyalar için tek bayrak okuyun. aşağıdaki gibi basitçe yapabilirsiniz:

void SetReadOnlyFlagForAllFiles(DirectoryInfo directory, bool isReadOnly) 
{ 
    // Iterate over ALL files using "*" wildcard and choosing to search all directories. 
    foreach(FileInfo File in directory.GetFiles("*", SearchOption.All.Directories)) 
    { 
     // Set flag. 
     File.IsReadOnly = isReadOnly; 
    } 
} 
+0

Ve sadece dizin okunduğunda ne yaparsınız, böylece dizinden dosya ekleyemez/silemezsiniz? OP'nin sorduğu şey buydu. – Dunk

+0

@Dunk Sorulmamış. Ve hala bir "Directory" nin salt okunur bir özniteliğe sahip olduğuna dair garip bir fikrin var ... değil. Kodlardan herhangi birini denedin mi? OPs kodu aslında çalışır, ancak sadece DirectoryInfo dosyasını FileInfo'ya atayabileceğiniz için. Gerçekten ne yapar, sadece tüm dosyalarda özniteliği ayarlar, kendiniz test edin. Bir dizin FileAttibutes.Normal veya .ReadOnly olarak ayarlanamaz. Her zaman .Directory. Ben explorer DAİMA dizinleri için ara durumu gösterir dediğim gibi. Ayrıca bir BAT dosyası "Salt Okunur" dizinini herhangi bir şekilde silebilir; –

1

IEnumerable/Lambda'ya çözümünü alt dizinlere ve dosyalara özelliğindeki salt okunur kaldırmak için:

new DirectoryInfo(@"some\test\path").GetDirectories("*", SearchOption.AllDirectories).ToList().ForEach(
    di => { 
     di.Attributes &= ~FileAttributes.ReadOnly; 
     di.GetFiles("*", SearchOption.TopDirectoryOnly).ToList().ForEach(fi => fi.IsReadOnly = false); 
    } 
); 
2

Windows dizinlerde salt okunur bayrağı aslında yanlış terimdir. Klasör salt okunur bayrağı kullanmaz. Sorun, kişiselleştirme ile olacak. Bayrak, Windows tarafından klasörde özelleştirmeler olduğunu tanımlamak için kullanılır.

Bu sunsetting bir konuyla, eski bir yazı olduğunu, ancak, bunu vurduğunda oldukça can sıkıcı olduğu gibi insanlar hala, içine aday olabileceğini düşündüm.

Microsoft's Explanation

+0

Öldü sen doğru. – STLDeveloper

0

Bu veya doğrudan ilişkili olmayabilir, ama senin durumunda kök sorunu altında yatan dosyaları neden olabilir.

System.IO.Directory.Delete(someDirectory, true) 

Bu sonuçlanır "yolu 'blah' Erişim engellendi": Örneğin, ben bir dizin silmeye çalışırken bu konuda koştum. Bu temel sorunu gidermek için, alt dosyalardaki salt okunur özniteliğini kaldırdım ve üst dizini kaldırabildim. Benim durumumda powershell kullanıyordum, bu yüzden .NET eşdeğerini kullanabilirsiniz.

dir -r $PrePackageDirectory |% {if ($_.PSIsContainer -ne $true){$_.IsReadOnly = $false}} 
İlgili konular