2011-09-13 10 views
64

Powiedzmy, że plik ma następujące atrybuty: ReadOnly, Hidden, Archived, System. Jak mogę usunąć tylko jeden atrybut? (na przykład tylko do odczytu)Jak usunąć pojedynczy atrybut (na przykład ReadOnly) z pliku?

Jeśli używam:

Io.File.SetAttributes("File.txt",IO.FileAttributes.Normal) 

usuwa wszelkie atrybuty.

+0

odczytać aktualne atrybuty, maska ​​atrybut, który wymaga, aby ustawić, ustawić atrybut ... –

Odpowiedz

79

Od MSDN: Można usunąć atrybut takiego

(ale odpowiedź @ SLL o słuszne ReadOnly jest lepszy tylko dla tego atrybutu)

using System; 
using System.IO; 
using System.Text; 
class Test 
{ 
    public static void Main() 
    { 
     string path = @"c:\temp\MyTest.txt"; 

     // Create the file if it exists. 
     if (!File.Exists(path)) 
     { 
      File.Create(path); 
     } 

     FileAttributes attributes = File.GetAttributes(path); 

     if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
     { 
      // Make the file RW 
      attributes = RemoveAttribute(attributes, FileAttributes.ReadOnly); 
      File.SetAttributes(path, attributes); 
      Console.WriteLine("The {0} file is no longer RO.", path); 
     } 
     else 
     { 
      // Make the file RO 
      File.SetAttributes(path, File.GetAttributes(path) | FileAttributes.Hidden); 
      Console.WriteLine("The {0} file is now RO.", path); 
     } 
    } 

    private static FileAttributes RemoveAttribute(FileAttributes attributes, FileAttributes attributesToRemove) 
    { 
     return attributes & ~attributesToRemove; 
    } 
} 
+0

Thx dużo, to było mniej więcej to, czego potrzebowałem: D – Bjqn

102

Odpowiadając na pytanie w tytule dotyczące atrybutu ReadOnly:

FileInfo fileInfo = new FileInfo(pathToAFile); 
fileInfo.IsReadOnly = false; 

Aby uzyskać kontrolę nad każdym przypisują sobie można użyć File.SetAttributes() metody. Link zapewnia również przykład.

+1

to działa wspaniały! ale tylko dla ReadOnly Attribute, (wiem, że pytałem o to w tytule, ale potrzebuję również innych atrybutów) – MilMike

+1

@qxxx: masz rację, jak już wspomniałem, musisz użyć metody SetAttributes(), aby zmodyfikować inne atrybuty – sll

+3

Jako jeden -liner: new FileInfo (fileName) {IsReadOnly = false} .Refresh() –

11
string file = "file.txt"; 
FileAttributes attrs = File.GetAttributes(file); 
if (attrs.HasFlag(FileAttributes.ReadOnly)) 
    File.SetAttributes(file, attrs & ~FileAttributes.ReadOnly); 
+0

Nie mogę dostać .HasFlag (SOMEFLAG); pracować ? – Bjqn

+0

@Bjqn, zadaj nowe pytanie! –

+0

Tak, mogłem, ale tak naprawdę nie muszę wiedzieć :) – Bjqn

1

rozwiązania jednej linii (pod warunkiem, że obecny użytkownik ma dostęp do zmiany atrybutów wspomnianego pliku) oto jak zrobiłbym to:

VB.Net

Shell("attrib file.txt -r") 

znak ujemny oznacza remove, a r jest przeznaczony tylko do odczytu. jeśli chcesz usunąć inne atrybuty jak dobrze byś zrobił:

Shell("attrib file.txt -r -s -h -a") 

To usunie tylko do odczytu z systemem, Plik, ukryty i Archiwum atrybuty.

jeśli chcesz oddać te atrybuty, oto jak:

Shell("attrib file.txt +r +s +h +a") 

kolejność nie ma znaczenia.

C#

Process.Start("cmd.exe", "attrib file.txt +r +s +h +a"); 

Referencje

+0

To nie są główne treści * zmiany *, są dodatkami zawartości i żaden z nich nie jest sprzeczny z duchem Stack Overflow. Są to dobre zmiany, powinni zostać. –

+1

Wydaje się to być odpowiednikiem pytania, gdzie należy dodać kwartę oleju do swojego samochodu, ale powiedziano, że powinieneś zanieść go do swojego dealera w celu wymiany oleju. Po co wykonywać polecenie powłoki tylko po to, aby odwrócić bit pliku atrybutu? Odpowiedź technicznie działa, więc nie padłem, ale zrobiłem to w moim sercu. – JMD

+0

@GeorgeStocker Dzięki za recenzję, doceniam to! – tehDorf

1
/// <summary> 
/// Addes the given FileAttributes to the given File. 
/// It's possible to combine FileAttributes: FileAttributes.Hidden | FileAttributes.ReadOnly 
/// </summary> 
public static void AttributesSet(this FileInfo pFile, FileAttributes pAttributes) 
{ 
    pFile.Attributes = pFile.Attributes | pAttributes; 
    pFile.Refresh(); 
} 

/// <summary> 
/// Removes the given FileAttributes from the given File. 
/// It's possible to combine FileAttributes: FileAttributes.Hidden | FileAttributes.ReadOnly 
/// </summary> 
public static void AttributesRemove(this FileInfo pFile, FileAttributes pAttributes) 
{ 
    pFile.Attributes = pFile.Attributes & ~pAttributes; 
    pFile.Refresh(); 
} 

/// <summary> 
/// Checks the given File on the given Attributes. 
/// It's possible to combine FileAttributes: FileAttributes.Hidden | FileAttributes.ReadOnly 
/// </summary> 
/// <returns>True if any Attribute is set, False if non is set</returns> 
public static bool AttributesIsAnySet(this FileInfo pFile, FileAttributes pAttributes) 
{ 
    return ((pFile.Attributes & pAttributes) > 0); 
} 

/// <summary> 
/// Checks the given File on the given Attributes. 
/// It's possible to combine FileAttributes: FileAttributes.Hidden | FileAttributes.ReadOnly 
/// </summary> 
/// <returns>True if all Attributes are set, False if any is not set</returns> 
public static bool AttributesIsSet(this FileInfo pFile, FileAttributes pAttributes) 
{ 
    return (pAttributes == (pFile.Attributes & pAttributes)); 
} 

Przykład:

private static void Test() 
{ 
    var lFileInfo = new FileInfo(@"C:\Neues Textdokument.txt"); 
    lFileInfo.AttributesSet(FileAttributes.Hidden | FileAttributes.ReadOnly); 
    lFileInfo.AttributesSet(FileAttributes.Temporary); 
    var lBool1 = lFileInfo.AttributesIsSet(FileAttributes.Hidden); 
    var lBool2 = lFileInfo.AttributesIsSet(FileAttributes.Temporary); 
    var lBool3 = lFileInfo.AttributesIsSet(FileAttributes.Encrypted); 
    var lBool4 = lFileInfo.AttributesIsSet(FileAttributes.ReadOnly | FileAttributes.Temporary); 
    var lBool5 = lFileInfo.AttributesIsSet(FileAttributes.ReadOnly | FileAttributes.Encrypted); 
    var lBool6 = lFileInfo.AttributesIsAnySet(FileAttributes.ReadOnly | FileAttributes.Temporary); 
    var lBool7 = lFileInfo.AttributesIsAnySet(FileAttributes.ReadOnly | FileAttributes.Encrypted); 
    var lBool8 = lFileInfo.AttributesIsAnySet(FileAttributes.Encrypted); 
    lFileInfo.AttributesRemove(FileAttributes.Temporary); 
    lFileInfo.AttributesRemove(FileAttributes.Hidden | FileAttributes.ReadOnly); 
} 
2
if ((oFileInfo.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
    oFileInfo.Attributes ^= FileAttributes.ReadOnly; 
Powiązane problemy