2011-12-23 26 views
24

Tôi có một tệp ẩn trên bộ lưu trữ di động USB của mình (hệ thống tệp FAT).Cách đặt thuộc tính rõ ràng "X" trên các tệp có trong C#?

Tôi đang sử dụng Windows 7. Nếu tôi đi đến cửa sổ Thuộc tính của tệp này và sau đó đến tab Chi tiết, tôi sẽ thấy rằng các thuộc tính của tệp là HX. Khi tôi chạy cmd và sử dụng attrib, tôi được cho biết rằng tập tin có thuộc tính H. Không có gì về X. Tôi đã thử help attrib, nhưng vẫn không có gì về thuộc tính X.

Tôi biết rằng:

  • H = ẩn
  • S = Hệ thống
  • A = Lưu trữ
  • R = chỉ đọc

Tuy nhiên, tôi không biết X là viết tắt của cái gì. Tôi cũng đã tìm thấy những gì N and E attributes dành cho.

Wikipedia không đề cập đến thuộc tính X là gì.

Google tìm thấy hai chủ đề đề cập đến thuộc tính X:

Không có cách nào trong số này hữu ích.

Tôi muốn đọc/viết cờ này trong C#, nhưng cho đến nay tôi đã đọc tài liệu cho FileAttributes enumeration và thử nghiệm thiết lập một số thuộc tính được liệt kê (sử dụng phương pháp File.GetAttributes & File.SetAttributes) trên tệp.

Không có thử nghiệm nào trong số này dẫn đến thuộc tính X hiển thị trong Thuộc tính -> Chi tiết. Vì vậy, tôi không có ý tưởng làm thế nào để tiếp cận nó, đặc biệt là kể từ khi tôi vẫn không biết những gì thuộc tính X có nghĩa là.

Vì vậy, thuộc tính X là gì và làm cách nào để đặt/xóa tệp đó trên tệp đã chọn trong C#?

+0

Dường như tất cả các bình luận đã bị mất - Tôi đã được hỏi nếu thuộc tính X sẽ biến mất sau khi thực hiện 'chkdsk'. Không, tôi đã thực hiện' chkdsk' - không có vấn đề gì được tìm thấy và thuộc tính X vẫn còn đó e. – beam022

+2

Tôi sẽ đoán thuộc tính tệp cố ý không hợp lệ. Có hai bit chưa được gán trong FAT32, 0x40 và 0x80. Đây chỉ là một phỏng đoán. –

+2

Tôi nghi ngờ Hans là đúng. Lấy các thuộc tính tệp, đưa nó vào 'int', và xuất nó trong hex. Sau đó so sánh các bit thiết lập với các hằng số thuộc tính tệp: http://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx. Điều đó sẽ cho bạn biết bit nào được đặt không đúng. Nếu bạn muốn xóa thuộc tính, hãy xóa nó trong int đó, đưa int trở lại một 'FileAttributes' và gọi' File.SetAttributes'. –

Trả lời

1

Có thể tôi sai nhưng ... Tôi nghĩ rằng thuộc tính X có nghĩa là tệp có extended attributes. Thật không may, các thuộc tính mở rộng không thể sửa đổi được bằng C#.

+0

Tôi nghĩ bạn có thể đúng về các thuộc tính mở rộng. Bây giờ tôi biết rằng không thể đặt 'FILE_ATTRIBUTE_DEVICE 0x40' bằng [' SetFileAttribute'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365535%28v=vs.85%29. aspx), nhưng có thể có một phương pháp khác để thiết lập hoặc xóa thuộc tính này bằng C#. Tôi đã đọc về 'EA DATA. SF', nhưng có vẻ như tôi có nhiều việc phải đọc hơn. Bất kỳ ý tưởng làm thế nào để truy cập và chỉnh sửa 'EA DATA. SF' tập tin từ C#? [Triển khai EA trên FAT] (http://ps-2.kev009.com:8081/tavi/os2pages/eadata.html), [EA - cái gì và như thế nào] (http://www.howzatt.demon.co) .uk/articles/06may93.html) – beam022

+0

Tôi đã thử một vài công cụ xóa tệp có sẵn ở đó, nhưng không có công cụ nào trong số chúng giúp loại bỏ tệp. Đối với 'EA DATA. SF', tôi không chắc rằng tệp EA này có trên ổ USB flash của tôi không. ** Làm thế nào để kiểm tra sự tồn tại của nó **? Nó được cho biết [ở đây] (http://www.cygwin.com/1.5/cygwin-ug-net/using-filemodes.html) rằng 'EA DATA. SF' _file chỉ có thể bị xóa bên ngoài Windows vì trạng thái "đang sử dụng" của nó_. Đó thực sự là một trường hợp? Và nếu tôi không thể loại bỏ tập tin với attr X, vì 'EA DATA. SF', mà tôi cũng không thể loại bỏ vì win7 ... Làm thế nào tôi có thể ** làm cho riêng của tôi 'EA DATA. SF' ** sau khi định dạng ổ flash? – beam022

+0

Lý do tôi hỏi cách kiểm tra 'EA DATA. Sự tồn tại của tệp SF' là vì nó không hiển thị trong trình khám phá (tôi đã đặt hiển thị các tệp hệ thống và ẩn). Tôi đã thử 'nếu tồn tại" EA DATA. SF "echo Nó ở đây!' Trong 'cmd', nhưng tôi đã không nhận được xác nhận. Có vẻ như nó không phải là 'EA DATA. Tệp SF' làm cho tệp khác không thể chạm được. Tôi có thể sai, sẽ đánh giá cao sự giúp đỡ. – beam022

0

X rất có thể là quyền thực thi. icalcs đề cập đến nó và bạn có thể sử dụng lệnh này từ C# để đặt thuộc tính tệp, mặc dù tôi không chắc liệu nó có hoạt động được với hệ thống tệp FAT hay không.

+0

Tôi không nghĩ rằng thuộc tính "thực thi" áp dụng cho hệ thống tệp Windows như FAT. – CedX

+0

Tôi đã đọc về 'icacls', cố gắng sử dụng nó trên tập tin được đề cập, có" Acces bị từ chối ". Sau đó, tôi đã thử nghiệm một chút với 'icacls' trên các tệp khác trên thanh USB, nhưng không nhận được rất xa: khi tôi gõ' icacls dummy' tất cả những gì tôi nhận được là 'dummy D: NO_ACCESS_CONTROL'. Tôi không thể thực hiện bất kỳ thay đổi nào đối với ACL của giả, mặc dù tôi đã thử '/ grant','/deny' và '/ remove'. Sau đó, tôi đã làm một số tìm kiếm và thấy rằng "acls lần đầu tiên được hỗ trợ bởi hệ thống tập tin ntfs" theo [andreas2610 post] (http://social.technet.microsoft.com/Forums/en-US/w7itprosecurity/thread/9e84667f-6eef -4f00-9a75-7c6d1d89a89b /) – beam022

1

Thật không may, API Windows sẽ ngăn bạn đặt/bỏ FILE_ATTRIBUTE_DEVICE vì nó không có nghĩa là được đặt trên tệp. Nếu bạn thực sự cần khả năng để làm điều đó bạn sẽ phải truy cập trực tiếp vào đĩa. Tôi không thực sự khuyên bạn nên cố gắng làm điều đó trong C#.

Triển khai nhanh nhất có thể có thể là quên cách thực hiện trong Windows, tải xuống mã nguồn cho mtools và thực hiện một số chỉnh sửa đối với nguồn mattrib để làm cho nó hoạt động.

ví dụ như thêm vào msdos.h:

#define ATTR_DEVICE 0x40 
#define IS_DEVICE(entry) (HAS_BIT((entry),ATTR_DEVICE)) 

Sau đó, thêm mã để mattr.c để bạn có thể thiết lập các thuộc tính và xác minh sự thay đổi:

static int view_attrib(direntry_t *entry, MainParam_t *mp) 
{ 
    ... 
    /* Add this if block */ 
    if(IS_DEVICE(entry)) 
     putchar('X'); 
    ... 
} 


static int concise_view_attrib(direntry_t *entry, MainParam_t *mp) 
{ 
    ... 
    /* Add the following if block */ 
    if(IS_DEVICE(entry)) 
     putchar('X'); 
    ... 
} 

static int letterToCode(int letter) 
{ 
    switch (toupper(letter)) { 
     ... 
     /* Add the following case */ 
    case 'X': 
     return ATTR_DEVICE; 
     ... 
    } 
} 

Sau đó, bạn sẽ chỉ phải thiết lập ổ đĩa của bạn trên mtools và gọi lệnh mattrib -x vừa được tạo của bạn trên tệp bạn muốn thay đổi.

+0

Cảm ơn câu trả lời của bạn, tuy nhiên tôi cần làm điều này trong Windows. – beam022

+0

Ah. Tất nhiên, bạn thực sự có thể có được mã này làm việc dưới Cygwin nếu bạn vẫn còn bị mắc kẹt. –

0

Tôi không thể tạo lại vấn đề của bạn, nhưng như cách giải quyết để loại bỏ thuộc tính tôi nghĩ bạn có thể thử với robocopy:

robocopy xattributefile copyoffile /copy:DT 

/copy:DT: Xác định các thuộc tính tập tin được sao chép.

này không nên sao chép thuộc tính nhưng tôi không biết nếu nó hoạt động với thuộc tính X)

1

tập tin thuộc tính X correspondes để System.IO.FileAttributes.Device trong đó có một giá trị số nguyên của 64 (0x40) sử dụng .NET bạn không thể trực tiếp thiết lập này giá trị. Vấn đề là khi bạn gọi File.SetAttributes(path, fileAttributes) nó gọi một chức năng dll nhập nội trong Mscorlib.dll, cụ thể là phương pháp tĩnh Microsoft.Win32.Win32Native.SetFileAttributes, đây là một khẩu dll trực tiếp của kernel32.dll và được định nghĩa là:

// Microsoft.Win32.Win32Native 
[DllImport("kernel32.dll", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true)] 
internal static extern bool SetFileAttributes(string name, int attr); 

Vì vậy, đặt đơn giản, thậm chí sử dụng kernel32.dll bạn không thể đặt giá trị này. Xem: SetFileAttributesSystem.IO.FileAttributes.

Nhưng, bạn có thể viết mã sẽ thực hiện tương tự như cài đặt hoặc xóa thuộc tính này.

Câu trả lời tốt nhất và có khả năng (hợp lý) của bạn là giữ tệp mẫu có quyền X, khi bạn cần đặt tệp có X bạn đổi tên tệp hiện có, sao chép tệp X và sau đó viết các thuộc tính khác.

Đối tháo X phép bạn nên đọc các tập tin và ghi vào một tập tin mới và sau đó sao chép có độ cấp phép sử dụng một cuộc gọi đơn giản để File.SetAttributes(path, File.GetAttributes(oldPath)); (mà sẽ không được thiết lập cho phép X.

Cách tiếp cận này là khá thẳng phía trước và sẽ hoàn toàn có thể trong bản địa .NET (và sẽ không thực sự trông quá khó chịu, hoặc so với hacking xung quanh ở mức đĩa hoặc gọi cgywin - nếu điều đó thậm chí sẽ làm việc)

Các vấn đề liên quan