萬盛學電腦網

 萬盛學電腦網 >> WORD教程 >> WORD使用技巧 >> 添加/刪除博客信息——Word 2007高級應用8

添加/刪除博客信息——Word 2007高級應用8

  Manage Blogs按鈕的其中一組重要功能是顯示、儲存和更改工作目錄的當前位置,而這個位置是儲存在配置中的,於是,我們得先構建好這個儲存設施。打開項目的屬 性窗口,切換到Settings頁面,在裡面添加WorkingDirectory項,並將其Type設置為string,Scope設置為User:

  添加/刪除博客信息——Word 2007高級應用(八)

  圖  1

  當用戶第一次運行插件時,工作目錄和WorkingDirectory項的值都沒有就緒,需要在所有自定義插件代碼運行之前創建工作目錄,並把WorkingDirectory項的值初始化為該目錄的路徑。初次運行時:

  在我的文檔目錄下創建一個My Blogs文件夾;

  在My Blogs文件夾裡面創建Blogs.xml數據文件;

  把WorkingDirectory項的值設置為第一步創建的文件夾的路徑。

  而當用戶更改工作目錄的位置時:

  裡面的東西會一並移動到新的位置;

  WorkingDirectory項的值會被設為新工作目錄的路徑。

  Manage Blogs按鈕的另一組重要功能是顯示現有博客、添加新博客、更改現有博客的名字和刪除現有博客。現有博客的顯示是通過獲取Blogs.xml裡的數據來實現的。新博客的添加會依次執行如下兩項操作:

  把新博客的名字和網頁地址添加到Blogs.xml裡;

  在工作目錄裡為新博客創建一個以其名字為名的文件夾,並在該文件夾裡分別創建Posts和Drafts兩個文件夾。

  對於一個給定的博客,它的網頁地址就是它的身份標識,一旦更改,我們就認為是一個新的博客,所以更改博客的信息僅限於更改它的名字,而這又涉及到如下兩項操作:

  把Blogs.xml裡對應的博客名字改為新的名字;

  把工作目錄裡對應的文件夾名字改為新的名字。

  現有博客的刪除也包含如下兩項操作:

  在Blogs.xml裡刪除該博客的對應信息;

  在工作目錄裡刪除該博客相關的文件夾及其內容。

  這些操作將會由BlogsManager類負責:

// Code #04
public class BlogsManager
{
private BlogsManager()
{
}
private static BlogsManager m_Instance = new BlogsManager();
public static BlogsManager Instance
{
get { return m_Instance; }
}
public void Initialize()
{
if (String.IsNullOrEmpty(WorkingDirectory))
{
Properties.Settings.Default.WorkingDirectory = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
"My Blogs"
);
}
if (!Directory.Exists(WorkingDirectory))
{
Directory.CreateDirectory(WorkingDirectory);
}
string metadataPath = Path.Combine(WorkingDirectory, "Blogs.xml");
if (!File.Exists(metadataPath))
{
XElement blogsMetadata = new XElement(
"blogs", new XAttribute("defaultBlog", String.Empty)
);
blogsMetadata.Save(metadataPath);
}
}
public string WorkingDirectory
{
get
{
return Properties.Settings.Default.WorkingDirectory;
}
set
{
if (Properties.Settings.Default.WorkingDirectory != value)
{
MoveWorkingDirectoryTo(value);
Properties.Settings.Default.WorkingDirectory = value;
}
}
}
public Blog[] Blogs
{
get
{
XElement blogsMetadata = XElement.Load(
Path.Combine(WorkingDirectory, "Blogs.xml")
);
var blogs = from blog in blogsMetadata.Elements()
select new Blog
{
Name = blog.Attribute("name").Value,
Url = blog.Attribute("url").Value
};
return blogs.ToArray();
}
}
public void Add(Blog blog)
{
// Add blog info to Blogs.xml
string metadataPath = Path.Combine(WorkingDirectory, "Blogs.xml");
XElement blogsMetadata = XElement.Load(metadataPath);
blogsMetadata.Add(
new XElement("blog", new XAttribute("name", blog.Name), new XAttribute("url", blog.Url))
);
blogsMetadata.Save(metadataPath);
// Create directory structure for blog
string blogPath = Path.Combine(WorkingDirectory, blog.Name);
string postsPath = Path.Combine(blogPath, "Posts");
string draftsPath = Path.Combine(blogPath, "Drafts");
Directory.CreateDirectory(blogPath);
Directory.CreateDirectory(postsPath);
Directory.CreateDirectory(draftsPath);
}
public void Rename(string oldBlogName, string newBlogName)
{
// Modify blog info in Blogs.xml
string metadataPath = Path.Combine(WorkingDirectory, "Blogs.xml");
XElement blogsMetadata = XElement.Load(metadataPath);
XElement blogMetadata = blogsMetadata.Elements().Single(
blog => blog.Attribute("name").Value == oldBlogName
);
blogMetadata.Attribute("name").Value = newBlogName;
blogsMetadata.Save(metadataPath);
// Rename blog directory
string oldBlogPath = Path.Combine(WorkingDirectory, oldBlogName);
string newBlogPath = Path.Combine(WorkingDirectory, newBlogName);
Directory.Move(oldBlogName, newBlogName);
}
public void Remove(string blogName)
{
// Remove blog info from Blogs.xml
string metadataPath = Path.Combine(WorkingDirectory, "Blogs.xml");
XElement blogsMetadata = XElement.Load(metadataPath);
XElement blogMetadata = blogsMetadata.Elements().Single(
blog => blog.Attribute("name").Value == blogName
);
blogMetadata.Remove();
blogsMetadata.Save(metadataPath);
// Remove blog directory
string blogPath = Path.Combine(WorkingDirectory, blogName);
Directory.Delete(blogPath, true);
}
private void MoveWorkingDirectoryTo(string newPath)
{
string oldPath = WorkingDirectory;
foreach (var directory in Directory.GetDirectories(oldPath))
{
Directory.Move(
directory,
Path.Combine(newPath, Path.GetFileName(directory))
);
}
File.Move(
Path.Combine(oldPath, "Blogs.xml"),
Path.Combine(newPath, "Blogs.xml")
);
}
}

  對於Code #04,以下幾點是需要說明的:

  BlogsManager類的Initialize() 方法將用在ThisAddIn_Startup裡所有代碼之前,確保運行插件的所有前提條件都得到滿足,而其它方法和屬性將用在點擊Manage Blogs按鈕所顯示的Blogs

copyright © 萬盛學電腦網 all rights reserved