ファイルから単一の属性(例:読み取り専用)を削除するにはどうすればよいですか?


83

たとえば、ファイルに次の属性があるとしますReadOnly, Hidden, Archived, System1つの属性のみを削除するにはどうすればよいですか?(たとえば、ReadOnly)

以下を使用すると、すべての属性が削除されます。

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

現在の属性を読み取り、設定する必要のある属性をマスクし、属性を設定します...
Mitch Wheat

回答:


108

MSDNから:このような属性はすべて削除できます

(ただし、ReadOnlyのみに対する@sllの回答は、その属性のみに適しています)

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

132

ReadOnly属性に関するタイトルの質問への回答:

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

自分で属性を制御するには、File.SetAttributes()メソッドを使用できます。リンクには例もあります。


1
これはうまくいきます!ただし、ReadOnly属性の場合のみ(タイトルで要求したことはわかっていますが、他の属性も必要です)
MilMike 2011

1
@qxxx:正解です。前述したように、別の属性を変更するには
SetAttributes

4
ワンライナーとして:new FileInfo(fileName){IsReadOnly = false} .Refresh()
Ohad Schneider

2
Refresh()は必要ですか?MSDNのこの例は、そうではないことを示唆しており、私のコード(確かにMonoを使用)は、呼び出さなくても機能します。
entheh 2013

1
私にとってもRefresh()は必要ないようです。
Jerther 2014年

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


1

1行のソリューション(現在のユーザーが上記のファイルの属性を変更するためのアクセス権を持っている場合)の場合、次のようにします。

VB.Net

Shell("attrib file.txt -r")

負の記号はtoremoveを意味し、rは読み取り専用です。他の属性も削除したい場合は、次のようにします。

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

参考文献


これらは主要なコンテンツの変更ではなく、コンテンツの追加であり、StackOverflowの精神に反するものはありません。彼らは良い編集です、彼らはとどまるべきです。
ジョージストッカー2014

3
これは、車に1クォートのオイルを追加する場所を尋ねるのと同じように見えますが、オイル交換のためにディーラーに持っていくように言われます。ファイル属性ビットを反転するためだけにシェルコマンドを実行するのはなぜですか?答えは技術的にはうまくいくので、私は反対票を投じませんでしたが、私は心の中でそうしました。
JMD 2014

@GeorgeStockerレビューしていただきありがとうございます、ありがとうございます!
tehDorf 2014

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.