搜了一圈用C#讀取與修改文件屬性的文章,結果幾乎找不到- -;windows
偶然間看到一個DSOFile工具,而後找到了對該工具進行詳細講解的一篇文章:《DSOfile,一個修改windows系統文件摘要的好東東。》,可是這裏面的代碼根本無法在C#的Console Application項目下直接用啊!因此一邊摸索一邊理解,一邊寫下這篇文章,給你們一點參考。服務器
首先,下載DSOFile.dll文件,解壓後在項目中引用它。這個文件是我從官網下載地址(點此打開)搬運過來的,上次更新竟然是在十年前,也就是2007年更新的。編輯器
而後就開始一邊碼代碼一邊講解了!ide
1.讀取與設置預設屬性工具
DSOFile內置了不少經常使用屬性值,在此不一一列舉,你能夠本身親自去查看。測試
OleDocumentProperties file=new OleDocumentProperties();//建立一個DSOFile對象 file.Open(@"D:\test.txt");//打開本地文件 file.SummaryProperties.Author = "Young";//設置做者的名字 file.Save();//保存更改,注意,千萬不能忘了這行代碼 Console.WriteLine(file.SummaryProperties.Author);//讀取輸出剛剛的更改 file.Close();
其中,DSOFile的好處在於,若是你嘗試輸出一個非幻燈片文件的SlideCount等屬性,它並不會產生錯誤,而是顯示爲0。spa
2.添加自定義屬性值.net
OleDocumentProperties file=new OleDocumentProperties();//建立一個DSOFile對象 file.Open(@"D:\test.txt");//打開本地文件 file.CustomProperties.Add("TestKey", "TestValue");//添加自定義屬性以及其屬性值 file.Save();//保存更改,注意,千萬不能忘了這行代碼 Console.WriteLine(file.CustomProperties[0].Name);//讀取輸出剛剛的添加 file.Close();
必須知道的是,對於一個文件,一個自定義屬性只能Add一次,也就是說,第二次運行上面的代碼就會報錯。因此當你添加自定義屬性前必定要先判斷是否已經存在該屬性。code
然而我並無在DSOFile中找到判斷屬性是否存在的相關方法,並且也沒法經過foreach來遍歷它的全部自定義屬性(若是有誤,歡迎指出),因此我本身寫了一個:server
/// <summary> /// 檢測該文件屬性中是否已經存在指定的自定義屬性key /// </summary> /// <param name="file">本地的文件</param> /// <param name="key">自定義的key</param> /// <returns>存在key返回true,不存在key返回false</returns> private static bool PropContains(OleDocumentProperties file,string key) { //因爲不能直接foreach,因此用了for循環 for (int i = 0; i < file.CustomProperties.Count; i++) { if (file.CustomProperties[i].Name==key) { return true; } } return false; }
3.修改自定義屬性值
/// <summary> /// 修改自定義屬性的屬性值 /// </summary> /// <param name="file">本地的文件</param> /// <param name="key">自定義的key</param> /// <returns>修改爲功返回true,不成功返回false</returns> private static bool PropChange(OleDocumentProperties file, string key, string value) { //因爲不能直接foreach,因此用了for循環 for (int i = 0; i < file.CustomProperties.Count; i++) { if (file.CustomProperties[i].Name == key) { file.CustomProperties[i].set_Value(value);//爲指定自定義屬性修改值 file.Save(); return true; } } return false; }
4.刪除自定義屬性
同上面思路同樣,經過循環找到對應的屬性,而後將其刪除。代碼以下:
file.CustomProperties[i].Remove();
根據測試,刪除操做不用執行file.Save();
這就是DSOFile的簡介,有不對的地方歡迎在評論去指出交流~
==========2017/9/22更新==========
發現自定義屬性超級容易丟失= =;
目前在如下幾種狀況下屬性會丟失:
1.當把文件經過網頁上傳至服務器端,server端將獲取到的文件流保存爲雲端文件,發現屬性丟失
解釋:server端獲取到的文件流,其實只是文件內的內容,因此天然不包含自定義的屬性值
參考:Use C#'s fileStream to save file will lose the file's attribute
2.經過ftp上傳,發現屬性丟失
3.用編輯器編輯,發現屬性丟失
說明:目前只測試過txt格式文件。
把設置了屬性的txt文件用windows自帶的記事本軟件編輯並保存,發現屬性還在
用VS Code編輯該文件並保存,發現屬性丟失