Làm cách nào để xóa một Thuộc tính duy nhất (ví dụ: ReadOnly) khỏi Tệp?


83

Hãy nói, một tập tin có các thuộc tính sau: ReadOnly, Hidden, Archived, System. Làm cách nào để tôi có thể xóa chỉ một Thuộc tính? (ví dụ ReadOnly)

Nếu tôi sử dụng phần sau, nó sẽ xóa tất cả các thuộc tính:

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

đọc thuộc tính hiện tại, mặt nạ các thuộc tính mà bạn yêu cầu để thiết lập, thiết lập các thuộc tính ...
Mitch Wheat

Câu trả lời:


108

Từ MSDN : Bạn có thể xóa bất kỳ thuộc tính nào như thế này

(nhưng câu trả lời của @ sll chỉ ReadOnly sẽ tốt hơn cho chỉ thuộc tính đó)

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

Làm gì ~?
newbieguy

132

Trả lời câu hỏi của bạn trong tiêu đề liên quan đến ReadOnlythuộc tính:

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

Để tự mình kiểm soát bất kỳ thuộc tính nào, bạn có thể sử dụng File.SetAttributes()phương pháp. Liên kết cũng cung cấp một ví dụ.


1
điều này hoạt động tuyệt vời! nhưng chỉ cho ReadOnly Thuộc tính, (Tôi biết tôi yêu cầu cho nó trong tiêu đề nhưng tôi cũng cần các thuộc tính khác)
MilMike

1
@qxxx: bạn nói đúng, như tôi đã đề cập, bạn phải sử dụng phương thức SetAttributes () để sửa đổi các thuộc tính khác
sll

4
Là một one-liner: new FileInfo (fileName) {IsReadOnly = false} .Refresh ()
Ohad Schneider

2
Làm mới () có cần thiết không? Ví dụ này trên MSDN cho thấy không phải vậy, và mã của tôi (phải thừa nhận với Mono) sẽ hoạt động nếu tôi không gọi nó.
entheh

1
Refresh () dường như cũng không cần thiết đối với tôi.
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

Đối với giải pháp một dòng (với điều kiện người dùng hiện tại có quyền truy cập để thay đổi các thuộc tính của tệp được đề cập), đây là cách tôi sẽ thực hiện:

VB.Net

Shell("attrib file.txt -r")

dấu âm có nghĩa là đến removevà dấu rlà chỉ đọc. nếu bạn cũng muốn xóa các thuộc tính khác, bạn sẽ làm như sau:

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

Điều đó sẽ loại bỏ các thuộc tính Chỉ đọc, Tệp Hệ thống, Ẩn và Lưu trữ.

nếu bạn muốn trả lại các thuộc tính này, đây là cách thực hiện:

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

thứ tự không quan trọng.

C #

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

Người giới thiệu


Đây không phải là những thay đổi nội dung lớn , chúng là những bổ sung nội dung và không có thay đổi nào đi ngược lại tinh thần của Stack Overflow. Chúng là những chỉnh sửa tốt, chúng nên ở lại.
George Stocker,

3
Điều này có vẻ tương đương với việc bạn hỏi nơi đổ dầu vào ô tô của bạn nhưng được thông báo rằng bạn nên đưa xe đến đại lý để thay dầu. Tại sao thực hiện lệnh shell chỉ để lật một bit thuộc tính tệp? Câu trả lời về mặt kỹ thuật hoạt động nên tôi không phản đối, nhưng tôi đã làm trong lòng.
JMD

@GeorgeStocker Cảm ơn bạn đã xem xét nó, tôi đánh giá cao điều đó!
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));
}

Thí dụ:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.