C#經過DSOFile讀取與修改文件的屬性

搜了一圈用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編輯該文件並保存,發現屬性丟失

相關文章
相關標籤/搜索