¿Cómo eliminar un único atributo (por ejemplo, de solo lectura) de un archivo?

83

Vamos a decir, un archivo tiene los siguientes atributos: ReadOnly, Hidden, Archived, System. ¿Cómo puedo eliminar solo un atributo? (por ejemplo ReadOnly)

Si utilizo lo siguiente, elimina todos los atributos:

IO.File.SetAttributes("File.txt",IO.FileAttributes.Normal)
MilMike
fuente
leer los atributos actuales, enmascarar el atributo que necesita establecer, establecer el atributo ...
Mitch Wheat

Respuestas:

108

De MSDN : puede eliminar cualquier atributo como este

(pero la respuesta de @ sll para solo ReadOnly es mejor solo para ese atributo)

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
fuente
¿Qué ~hacer?
novato
132

Respondiendo a su pregunta en el título con respecto al ReadOnlyatributo:

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

Para obtener el control de cualquier atributo usted mismo, puede usar el File.SetAttributes()método. El enlace también proporciona un ejemplo.

sll
fuente
1
esto funciona muy bien! pero solo para el atributo ReadOnly (sé que lo pedí en el título, pero también necesito otros atributos)
MilMike
1
@qxxx: tiene razón, como mencioné, debe usar el método SetAttributes () para modificar otros atributos
sll
4
Como una sola línea: new FileInfo (fileName) {IsReadOnly = false} .Refresh ()
Ohad Schneider
2
¿Es necesario Refresh ()? Este ejemplo en MSDN sugiere que no lo es, y mi código (ciertamente con Mono) funciona si no lo llamo.
entheh
1
Refresh () tampoco parece necesario para mí.
Jerther
13
string file = "file.txt";
FileAttributes attrs = File.GetAttributes(file);
if (attrs.HasFlag(FileAttributes.ReadOnly))
    File.SetAttributes(file, attrs & ~FileAttributes.ReadOnly);
Rubens Farias
fuente
3
if ((oFileInfo.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
    oFileInfo.Attributes ^= FileAttributes.ReadOnly;
alternatefaraz
fuente
1

Para una solución de una línea (siempre que el usuario actual tenga acceso para cambiar los atributos del archivo mencionado) así es como lo haría:

VB.Net

Shell("attrib file.txt -r")

el signo negativo significa ay removeel res de solo lectura. si también desea eliminar otros atributos, lo haría:

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

Eso eliminará los atributos de solo lectura, archivo de sistema, oculto y archivo.

Si desea devolver estos atributos, así es como:

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

El orden no importa.

C#

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

Referencias

Ahmad
fuente
Estos no son cambios importantes de contenido , son adiciones de contenido y ninguno de ellos va en contra del espíritu de Stack Overflow. Son buenas ediciones, deberían quedarse.
George Stocker
3
Esto parece el equivalente a preguntar dónde agregar un litro de aceite a su automóvil, pero que le digan que debe llevarlo a su concesionario para un cambio de aceite. ¿Por qué ejecutar un comando de shell solo para invertir un bit de atributo de archivo? La respuesta técnicamente funciona, así que no voté en contra, pero lo hice en mi corazón.
JMD
@GeorgeStocker Gracias por revisarlo, ¡te lo agradezco!
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));
}

Ejemplo:

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);
}
usuario2029101
fuente