파일에서 단일 속성 (예 : ReadOnly)을 제거하는 방법은 무엇입니까?


83

파일에 다음 속성이 있다고 가정 해 보겠습니다 ReadOnly, Hidden, Archived, System.. 하나의 속성 만 제거하려면 어떻게해야합니까? (예 : ReadOnly)

다음을 사용하면 모든 속성이 제거됩니다.

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

속성을 설정하면 설정에 필요한 속성 ... 마스크, 현재의 속성을 읽기
미치 밀

답변:


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
이것은 훌륭하게 작동합니다! 하지만 읽기 전용 속성에 대한, (난 내가 제목에 요청 알고 있지만 나는 또한 다른 속성을 필요)
MilMike

1
@qxxx : 맞습니다. 제가 언급했듯이 다른 속성을 수정하려면 SetAttributes () 메서드를 사용해야합니다
sll

4
새로운에서는 FileInfo (파일 이름) {isReadOnly의 = 거짓} 때 .refresh () : 한 - 라이너로
오핫 슈나이더

2
Refresh ()가 필요합니까? MSDN의이 예제 는 그렇지 않다고 제안하며, 내 코드 (Mono로 인정됨)는 호출하지 않으면 작동합니다.
entheh dec

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

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

읽기 전용, 시스템 파일, 숨김 및 보관 속성이 제거됩니다.

이러한 속성을 되돌리려면 방법은 다음과 같습니다.

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

순서는 중요하지 않습니다.

씨#

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

참고 문헌


이는 주요 콘텐츠 변경 사항 이 아니며 콘텐츠 추가 사항 이며 Stack Overflow의 정신에 반하는 것은 없습니다. 좋은 편집입니다. 그대로 있어야합니다.
George Stocker

3
이것은 자동차에 1 쿼트의 오일을 어디에 추가해야하는지 묻는 것과 같지만 오일 교환을 위해 대리점에 가져 가야한다는 말을 듣는 것과 같습니다. 파일 속성 비트를 뒤집기 위해 쉘 명령을 실행하는 이유는 무엇입니까? 대답은 기술적으로 작동하므로 반대표를 던지지 않았지만 마음 속으로했습니다.
JMD 2014 년

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.