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


83

Пусть говорят, файл має такі атрибути: ReadOnly, Hidden, Archived, System. Як я можу видалити лише один атрибут? (наприклад, ReadOnly)

Якщо я використовую наступне, це видаляє всі атрибути:

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

читати поточні атрибути, маскувати атрибут, який потрібно встановити, встановлювати атрибут ...
Mitch Wheat

Відповіді:


108

З 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;
    }
}

Що робить ~?
новачок

132

Відповідаючи на ваше запитання в заголовку щодо ReadOnlyатрибута:

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

Щоб отримати контроль над будь-яким атрибутом самостійно, ви можете використовувати File.SetAttributes()метод. Посилання також наводить приклад.


1
це чудово працює! але тільки для атрибута ReadOnly, (я знаю, що я просив про це в назві, але мені також потрібні інші атрибути)
MilMike

1
@qxxx: ти маєш рацію, як я вже згадував, ти повинен використовувати метод SetAttributes () для зміни інших атрибутів
sll

4
Як однокласник: новий FileInfo (ім’я файлу) {IsReadOnly = false}. Refresh ()
Охад Шнайдер

2
Чи потрібно оновити ()? Цей приклад на MSDN передбачає, що це не так, і мій код (правда, з Mono) працює, якщо я його не називаю.
entheh

1
Refresh () мені теж не потрібен.
Джертер

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


1

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

VB.Net

Shell("attrib file.txt -r")

від’ємний знак означає, removeа ra - лише для читання. якщо ви хочете також видалити інші атрибути, ви б зробили:

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

Це видалить атрибути "Лише для читання", "Системний файл", "Приховані" та "Архів".

якщо ви хочете повернути ці атрибути, ось як:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.