2011-12-23 81 views
24

我在我的USB可移動存儲(FAT文件系統)上有一個隱藏文件。如何在C#文件中設置清除屬性「X」?

我正在使用Windows 7.如果我轉到此文件的「屬性」窗口,然後轉到「詳細信息」選項卡,我會看到該文件的屬性爲HX。當我運行cmd和使用attrib,我被告知,文件的屬性是H.一無所知X.我已經試過help attrib,但仍一無所知屬性X.

我知道:

  • H =隱藏
  • S =系統
  • A =檔案
  • R =只讀

但是,我不知道X代表什麼。我也發現了N and E attributes的用途。

Wikipedia沒有提及X屬性是什麼。

谷歌發現了兩個主題提的屬性X:

沒有這些幫助。

我希望能夠讀/寫C#這個標誌,但到目前爲止,我閱讀文檔的FileAttributes enumeration,並在文件中設置一些上市屬性(使用File.GetAttributes & File.SetAttributes方法)實驗。

這些實驗都沒有導致在屬性 - >詳細信息中顯示屬性X.所以,我不知道如何處理它,特別是因爲我仍然不知道X的含義。

那麼,什麼是屬性X以及如何在C#中的選定文件上設置/清除它?

+0

似乎所有的評論都丟失了 - 我被問到在執行'chkdsk'之後屬性X是否會消失。不,我已經完成了'chkdsk' - 沒有發現任何問題,並且屬性X還是即 – beam022 2011-12-23 17:45:02

+2

我想在一個故意無效的文件屬性。在FAT32,0x40和0x80中有兩個未分配的位。這只是一個猜測。 – 2011-12-23 19:19:00

+2

我懷疑漢斯是對的。獲取文件屬性,將其轉換爲「int」,並以十六進制輸出。然後將設置位與文件屬性常量進行比較:http://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx。這應該告訴你哪個位被錯誤設置。如果要清除屬性,請在該int中清除它,然後將該int轉換回到'FileAttributes',然後調用'File.SetAttributes'。 – 2011-12-23 20:12:43

回答

1

也許我錯了,但是...我認爲X屬性意味着文件有extended attributes。不幸的是,擴展屬性不能用C#修改。

+0

我想你可能是正確的擴展屬性。我現在知道'FILE_ATTRIBUTE_DEVICE 0x40'不能使用['SetFileAttribute'](http://msdn.microsoft.com/en-us/library/windows/desktop/aa365535%28v=vs.85%29)設置。 aspx),但也許有另一種方法使用C#設置或清除此屬性。我讀過'EA DATA'。 SF',但看起來我有更多的閱讀要做。任何想法如何訪問和編輯EA數據。來自C#的SF'文件? [在FAT上實施EA](http://ps-2.kev009.com:8081/tavi/os2pages/eadata.html),[EA - 什麼和如何](http://www.howzatt.demon.co .uk/articles/06may93.html) – beam022 2011-12-24 03:08:22

+0

我嘗試了幾個可用的文件刪除工具,但沒有一個幫助擺脫該文件。至於'EA DATA。 SF',我不確定這個EA文件是否在我的閃存USB驅動器上。 **如何檢查它的存在**?據說[這裏](http://www.cygwin.com/1.5/cygwin-ug-net/using-filemodes.html)表示EA數據。由於「正在使用」status_,SF' _file只能在Windows之外被刪除。這是真的嗎?如果我不能用attr X移除文件,因爲EA數據。 SF',我也無法刪除,因爲win7 ...我怎麼能**做我自己的EA數據。格式化閃存驅動器後的SF' **? – beam022 2011-12-24 10:32:35

+0

我問及如何檢查EA數據的原因。 SF'文件的存在是因爲它沒有顯示在資源管理器(我已經設置顯示隱藏和系統文件)。我嘗試過'如果存在'EA DATA。SF'echo'在'cmd'中,但是我沒有得到確認。看起來它不是EA數據。 SF'文件,使其他文件不可觸摸。我可能是錯的,會感謝幫助。 – beam022 2011-12-27 20:24:44

0

X很可能是執行權限。 icalcs提到它,你可以使用C#中的這個命令來設置一個文件屬性,雖然我不確定它是否會對FAT文件系統起作用。

+0

我不認爲「執行」屬性適用於像FAT這樣的Windows文件系統。 – CedX 2011-12-23 19:56:33

+0

我讀過'icacls',試圖在文件上使用它,得到了「Acces denied」。然後,我在USB棒上的其他文件上試用了一些'icacls',但沒有得到太多的結果:當我輸入'icacls dummy'時,我得到的是'D:NO_ACCESS_CONTROL'。即使我嘗試了'/ grant','/ deny'和'/ remove',我也無法對dummy的ACL進行更改。然後我做了一些搜索,發現根據[andreas2610 post](http://social.technet.microsoft.com/Forums/en-US/w7itprosecurity/thread/9e84667f-6eef),「acls首先由ntfs文件系統支持」 -4f00-9a75-7c6d1d89a89b /) – beam022 2011-12-23 20:20:56

1

不幸的是,Windows API將阻止您設置/取消設置FILE_ATTRIBUTE_DEVICE,因爲它不打算設置在文件上。如果你真的需要這樣做的能力,你將不得不直接訪問磁盤。我真的不建議在C#中嘗試這樣做。

最快可能的實現可能是忘記在Windows中執行它,下載源代碼爲mtools,並對mattrib源文件進行一些編輯以使其正常工作。

例如添加到msdos.h:

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

然後添加代碼來mattr.c,您可以設置屬性和驗證的變化:

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

那麼你就只需要在mtools上設置你的驅動器,並在你想改變的文件上調用你新創建的mattrib -x命令。

+0

感謝您的回答,但是我需要在Windows中執行此操作。 – beam022 2013-03-05 13:35:05

+0

啊。當然,如果你仍然陷入困境,你實際上可能能夠在Cygwin下運行這些代碼。 – 2013-03-05 14:44:30

0

我無法重現你的問題,但作爲變通方法來刪除屬性,我認爲你可以嘗試robocopy

robocopy xattributefile copyoffile /copy:DT 

/copy:DT:指定文件的屬性被複制。

使用.NET你不能直接設置此這不應該複製的屬性,但我不知道這是否與X屬性適用)

1

文件屬性X correspondes到System.IO.FileAttributes.Device其中有64(0x40的整數值)值。問題是,當你調用File.SetAttributes(path, fileAttributes)它調用Mscorlib.dll內部DLL的導入功能,即靜態方法Microsoft.Win32.Win32Native.SetFileAttributes,這是kernel32.dll直接DLL導入,並定義爲:

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

所以簡單地說,即使使用kernel32.dll您無法設置此值。參見:SetFileAttributesSystem.IO.FileAttributes

但是,您可以編寫代碼,它將有效地執行與設置或刪除此屬性相同的代碼。

你最好的和可能只(合理的)答案會保持一個模板文件與X權限,當你需要設置一個文件有X重命名現有的文件,複製的模板X文件,然後寫其他屬性。

爲了去除X同意你應該閱讀的文件,並寫入到一個新的文件,然後複製到使用一個File.SetAttributes(path, File.GetAttributes(oldPath));簡單的調用(這將不設置X允許有權限。

這種做法是相當平直向前,並將完全可能在本地.NET(並不會真的看起來太討厭,相比之下,在磁盤級別或調用cgywin - 如果這將甚至工作)