Wie entferne ich ein einzelnes Attribut (z. B. ReadOnly) aus einer Datei?

82

Angenommen, eine Datei weist die folgenden Attribute auf : ReadOnly, Hidden, Archived, System. Wie kann ich nur ein Attribut entfernen? (zum Beispiel ReadOnly)

Wenn ich Folgendes verwende, werden alle Attribute entfernt:

IO.File.SetAttributes("File.txt",IO.FileAttributes.Normal)
MilMike
quelle
Lesen Sie die aktuellen Attribute, maskieren Sie das Attribut, das Sie festlegen möchten, legen Sie das Attribut fest ...
Mitch Wheat

Antworten:

107

Aus MSDN : Sie können jedes Attribut wie dieses entfernen

(aber die Antwort von @ sll für nur ReadOnly ist besser für nur dieses Attribut)

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;
    }
}
Preet Sangha
quelle
Was macht ~das
Newbieguy
131

Beantwortung Ihrer Frage im Titel zum ReadOnlyAttribut:

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

Um die Kontrolle über ein Attribut selbst zu erlangen, können Sie die File.SetAttributes()Methode verwenden. Der Link bietet auch ein Beispiel.

sll
quelle
1
das funktioniert super! aber nur für ReadOnly-Attribut (ich weiß, ich habe im Titel danach gefragt, aber ich brauche auch andere Attribute)
MilMike
1
@qxxx: Sie haben Recht, wie ich bereits erwähnt habe, müssen Sie die SetAttributes () -Methode verwenden, um andere Attribute zu ändern
sll
4
Als Einzeiler: new FileInfo (fileName) {IsReadOnly = false} .Refresh ()
Ohad Schneider
2
Ist Refresh () notwendig? Dieses Beispiel auf MSDN legt nahe, dass dies nicht der Fall ist, und mein Code (zugegebenermaßen mit Mono) funktioniert, wenn ich ihn nicht aufrufe.
Entheh
1
Refresh () scheint mir auch nicht notwendig zu sein.
Jerther
13
string file = "file.txt";
FileAttributes attrs = File.GetAttributes(file);
if (attrs.HasFlag(FileAttributes.ReadOnly))
    File.SetAttributes(file, attrs & ~FileAttributes.ReadOnly);
Rubens Farias
quelle
3
if ((oFileInfo.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
    oFileInfo.Attributes ^= FileAttributes.ReadOnly;
Alternatefaraz
quelle
1

Bei einer einzeiligen Lösung (vorausgesetzt, der aktuelle Benutzer kann die Attribute der genannten Datei ändern) würde ich Folgendes tun:

VB.Net

Shell("attrib file.txt -r")

Das negative Vorzeichen bedeutet zu removeund das rist schreibgeschützt. Wenn Sie auch andere Attribute entfernen möchten, tun Sie Folgendes:

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

Dadurch werden die Attribute "Schreibgeschützt", "Systemdatei", "Versteckt" und "Archivieren" entfernt.

Wenn Sie diese Attribute zurückgeben möchten, gehen Sie wie folgt vor:

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

Die Reihenfolge spielt keine Rolle.

C #

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

Verweise

Ahmad
quelle
Diese sind nicht große Content - Änderungen , sie sind Inhalt Ergänzungen, und keiner von ihnen im Widerspruch zum Geist des Stack - Überlaufes. Sie sind gute Bearbeitungen, sie sollten bleiben.
George Stocker
2
Dies scheint das Äquivalent zu der Frage zu sein, wo Sie Ihrem Auto einen Liter Öl hinzufügen sollen, aber wenn Sie aufgefordert werden, es für einen Ölwechsel zu Ihrem Händler zu bringen. Warum einen Shell-Befehl ausführen, um nur ein Dateiattributbit umzudrehen? Die Antwort funktioniert technisch, also habe ich nicht abgelehnt, aber ich habe es in meinem Herzen getan.
JMD
@ GeorgeStocker Danke für die Bewertung, das weiß ich zu schätzen!
Dorf
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));
}

Beispiel:

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);
}
user2029101
quelle