2011-09-13 10 views
64

Diciamo che un file ha i seguenti attributi: ReadOnly, Hidden, Archived, System. Come posso rimuovere solo un attributo? (ad esempio ReadOnly)Come rimuovere un singolo attributo (ad es. ReadOnly) da un file?

Se uso:

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

rimuove tutti gli attributi.

+0

leggere attributi correnti, mascherare l'attributo si richiede di impostare, impostare l'attributo ... –

risposta

79

Da MSDN: È possibile rimuovere qualsiasi attributo come questo

(ma la risposta di @ SLL per soli ReadOnly è migliore solo per quell'attributo)

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 molto, questo era più di meno proprio quello che mi serviva: D – Bjqn

102

Rispondendo alla tua domanda nel titolo per quanto riguarda l'attributo ReadOnly:

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

per ottenere il controllo su qualsiasi te stesso attributo è possibile utilizzare File.SetAttributes() metodo. Il link fornisce anche un esempio.

+1

questo funziona grande! ma solo per ReadOnly Attribute, (so che l'ho chiesto nel titolo ma ho anche bisogno di altri attributi) – MilMike

+1

@qxxx: hai ragione, come ho detto devi usare il metodo SetAttributes() per modificare altri attributi – sll

+3

Come uno -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

Non riesco a ottenere. HasFlag (SOMEFLAG); lavorare ? – Bjqn

+0

@Bjqn, fai una nuova domanda! –

+0

Sì, potrei, ma non ho davvero bisogno di sapere :) – Bjqn

1

Per una soluzione di una riga (a condizione che l'utente corrente ha accesso a modificare gli attributi del file menzionato) ecco come lo farei:

VB.Net

Shell("attrib file.txt -r") 

il segno negativo significa remove e r è di sola lettura. se si desidera rimuovere gli altri attributi, come bene si farebbe:

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

che rimuoverà la sola lettura, sistema di file, Nascosto e archivio attributi.

se si vuole restituire questi attributi, ecco come:

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

l'ordine non importa.

C#

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

Riferimenti

+0

Questi non sono contenuti importanti * modifiche *, sono aggiunte di contenuti e nessuno di essi va contro lo spirito di Stack Overflow. Sono buone modifiche, dovrebbero rimanere. –

+1

Questo sembra l'equivalente di chiedere dove aggiungere un litro di olio alla tua auto ma viene detto che dovresti portarlo al tuo concessionario per un cambio d'olio. Perché eseguire un comando di shell solo per capovolgere un bit di attributo di file? La risposta funziona tecnicamente, quindi non ho votato a valle, ma l'ho fatto nel mio cuore. – JMD

+0

@GeorgeStocker Grazie per averlo recensito, lo apprezzo! – 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)); 
} 

:

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; 
Problemi correlati