Как удалить один атрибут (например, ReadOnly) из файла?

84

Пусть говорят, файл имеет следующие атрибуты: ReadOnly, Hidden, Archived, System. Как я могу удалить только один атрибут? (например ReadOnly)

Если я использую следующее, он удаляет все атрибуты:

IO.File.SetAttributes("File.txt",IO.FileAttributes.Normal)
MilMike
источник
прочтите текущие атрибуты, замаскируйте атрибут, который вы хотите установить, установите атрибут ...
Митч Уит,

Ответы:

109

Из MSDN : вы можете удалить любой подобный атрибут

(но ответ @ sll только для ReadOnly лучше только для этого атрибута)

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;
    }
}
Прит Сангха
источник
Что ~делать?
newbieguy
@ newbieguy: Это унарный оператор двоичного дополнения (он же побитовый оператор not). docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Стефан Штайгер,
132

Отвечая на ваш вопрос в заголовке относительно ReadOnlyатрибута:

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

Чтобы получить контроль над любым атрибутом самостоятельно, вы можете использовать File.SetAttributes()метод. По ссылке также приведен пример.

sll
источник
1
это отлично работает! но только для атрибута ReadOnly (я знаю, что просил
указать
1
@qxxx: вы правы, как я уже упоминал, вы должны использовать метод SetAttributes () для изменения других атрибутов
sll
4
В качестве однострочного: новый FileInfo (fileName) {IsReadOnly = false} .Refresh ()
Охад Шнайдер,
2
Требуется ли Refresh ()? Этот пример на MSDN предполагает, что это не так, и мой код (по общему признанию с Mono) работает, если я его не называю.
entheh
1
Refresh () мне тоже не нужен.
Jerther
13
string file = "file.txt";
FileAttributes attrs = File.GetAttributes(file);
if (attrs.HasFlag(FileAttributes.ReadOnly))
    File.SetAttributes(file, attrs & ~FileAttributes.ReadOnly);
Рубенс Фариас
источник
3
if ((oFileInfo.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
    oFileInfo.Attributes ^= FileAttributes.ReadOnly;
альтернатива
источник
1

Для однострочного решения (при условии, что текущий пользователь имеет доступ для изменения атрибутов указанного файла) вот как я бы это сделал:

VB.Net

Shell("attrib file.txt -r")

отрицательный знак означает, removeчто он rпредназначен только для чтения. если вы хотите удалить и другие атрибуты, сделайте следующее:

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

Это удалит атрибуты Read-Only, System-File, Hidden и Archive.

если вы хотите вернуть эти атрибуты, вот как:

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

порядок не имеет значения.

C #

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

Рекомендации

Ахмад
источник
Это не основные изменения содержимого , это его дополнения, и ни одно из них не противоречит духу Stack Overflow. Это хорошие правки, они должны остаться.
Джордж Стокер
3
Это похоже на вопрос о том, куда добавить литр масла в машину, но вам говорят, что вам следует отнести это в свой дилерский центр для замены масла. Зачем выполнять команду оболочки только для того, чтобы перевернуть бит атрибута файла? Технически ответ работает, поэтому я не голосовал против, но в глубине души сделал.
JMD
@GeorgeStocker Спасибо за обзор, я ценю это!
tehDorf 06
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);
}
user2029101
источник