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


搜了一圈用C#讀取與修改文件屬性的文章,結果幾乎找不到- -;

偶然間看到一個DSOFile工具,然后找到了對該工具進行詳細講解的一篇文章:《DSOfile,一個修改windows系統文件摘要的好東東。》,但是這里面的代碼根本沒法在C#的Console Application項目下直接用啊!所以一邊摸索一邊理解,一邊寫下這篇文章,給大家一點參考。

 

首先,下載DSOFile.dll文件,解壓后在項目中引用它。這個文件是我從官網下載地址(點此打開)搬運過來的,上次更新居然是在十年前,也就是2007年更新的。

然后就開始一邊碼代碼一邊講解了!

 

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。

 

2.添加自定義屬性值

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一次,也就是說,第二次運行上面的代碼就會報錯。所以當你添加自定義屬性前一定要先判斷是否已經存在該屬性。

然而我並沒有在DSOFile中找到判斷屬性是否存在的相關方法,而且也無法通過foreach來遍歷它的所有自定義屬性(如果有誤,歡迎指出),所以我自己寫了一個:

/// <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編輯該文件並保存,發現屬性丟失

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM