2010-02-23 67 views
32

Làm cách nào để xóa thuộc tính chỉ đọc khỏi một thư mục trong C#?Xóa thuộc tính chỉ đọc khỏi thư mục

+0

@Lalit Bạn đang cố gắng đạt được điều gì? –

+0

xem tôi đã đọc thư mục chỉ trên một số đường dẫn của tôi. Tôi muốn sao chép một số tệp trong thư mục đó. vì vậy mà muốn tạm thời làm cho nó có thể ghi có nghĩa là loại bỏ chỉ đọc, sau đó sao chép các tập tin sau đó một lần nữa làm cho foleder như chỉ đọc. bạn có thể giúp tôi plaese? Đây là yêu cầu. –

+0

Trên Windows, có thuộc tính chỉ đọc được đặt trên một thư mục thực sự là vô nghĩa. Bạn vẫn có thể xóa, đổi tên, vv thư mục đó. Xem https://support.microsoft.com/en-us/help/326549/you-cannot-view-or-change-the-read-only-or-the-system-attributes-of-folders-in-windows -server-2003, -in-windows-xp, -in-windows-vista-hoặc-trong-windows-7 để biết thêm thông tin. –

Trả lời

73
var di = new DirectoryInfo("SomeFolder"); 
di.Attributes &= ~FileAttributes.ReadOnly; 
+3

hey darin, cú pháp này có ý nghĩa gì? "& = ~" cổ vũ! – andy

+27

& = -> Nối để không chạm vào tất cả các thuộc tính khác và ~ -> bổ sung để đối lập với chỉ đọc – MarkKGreenway

5

Dưới đây là một liên kết tốt để ví dụ về sửa đổi tập tin thuộc tính sử dụng C#

http://www.csharp-examples.net/file-attributes/

dựa trên ví dụ của mình, bạn có thể loại bỏ các Read Only thuộc tính như thế này (tôi đã không kiểm tra này):

File.SetAttributes(filePath, File.GetAttributes(filePath) & ~FileAttributes.ReadOnly); 
+4

đến đây tất cả về File. wana abt Directory .... làm ơn. –

+1

@Red Swan: Tôi vừa thử nghiệm tính năng này để thêm các thuộc tính ẩn và nó cũng hoạt động tốt với các thư mục. – Petrucio

+1

Điều này làm việc cho các tệp và thư mục vì một thư mục giống như một tệp đặc biệt với bộ thuộc tính thư mục (FileAttributes.Directory). – seveves

2

Nếu bạn đang cố loại bỏ thuộc tính của tệp trong hệ thống tệp, hãy tạo một thể hiện của lớp System.IO.FileInfo và đặt thuộc tính IsReadOnly thành false.

 FileInfo file = new FileInfo("c:\\microsoft.text"); 
     file.IsReadOnly = false; 
+0

không phải về tệp. Tôi muốn Directory/Folder –

0

OK. ;)

class Program 
{ 
    static void Main(string[] args) 
    { 
     DirectoryInfo di = new DirectoryInfo("c:\\test"); 

     FileAttributes f = di.Attributes; 

     Console.WriteLine("Directory c:\\test has attributes:"); 
     DecipherAttributes(f); 

    } 

    public static void DecipherAttributes(FileAttributes f) 
    { 
     // To set use File.SetAttributes 

     File.SetAttributes(@"C:\test", FileAttributes.ReadOnly); 

     if ((f & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
      Console.WriteLine("ReadOnly"); 

     // To remove readonly use "-=" 
     f -= FileAttributes.ReadOnly; 

     if ((f & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
      Console.WriteLine("ReadOnly"); 
     else 
      Console.WriteLine("Not ReadOnly"); 
    } 
} 
3

Sử dụng - operator = chuyển nhượng là nguy hiểm vì hai lý do: 1) Nó chỉ hoạt động nếu thuộc tính ReadOnly được thiết lập, do vậy xét nghiệm là cần thiết trước. 2) Thực hiện thao tác trừ, không phải là lựa chọn tốt nhất khi làm việc với cờ nhị phân. Hoạt động trừ hoạt động nếu điều kiện 1 (ở trên) là đúng, nhưng các phép toán trừ bổ sung sẽ THAY ĐỔI CÁC BITS KHÁC trong trường FileAttributes!

Sử dụng "& = ~ FileAttributes.ReadOnly;" để đặt lại cờ ReadOnly.

Sử dụng "| = FileAttributes.ReadOnly;" để đặt cờ ReadOnly.

0

Thiết Attributes để FileAttributes.Normal làm việc cho tôi trên cả hai thư mụcfile.

+0

Mối quan tâm duy nhất tôi có với phương pháp này là gì nếu thư mục (hoặc tệp) có thuộc tính khác? Nếu một thư mục bị ẩn và chỉ đọc, và bạn chỉ muốn làm cho nó không còn đọc được nữa, phương pháp của bạn sẽ làm cho nó không còn bị ẩn nữa. Điều đó có thể có hậu quả ngoài ý muốn. –

0
public static void DeleteDirectory(string path) 
    { 
     var directory = new DirectoryInfo(path) 
     { Attributes =FileAttributes.Normal }; 
     foreach (var info in directory.GetFileSystemInfos("*", SearchOption.AllDirectories)) 
     { 
      info.Attributes = FileAttributes.Normal; 
     } 
     directory.Delete(true); 
    } 
Các vấn đề liên quan