程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 閉關紀要3.C#的結構化存儲功能以及在Web開發之中的應用(4)

閉關紀要3.C#的結構化存儲功能以及在Web開發之中的應用(4)

編輯:關於C語言
有一個FileSystemOS,明顯是這直接使用系統文件存儲,我就不列出代碼了,下面看看我在頁面上如何調用吧(頁面上並不關心采用哪種文件系統):

Page.cs

1      DateTime lastWriteTime=DateTime.Now;
2      //檢查是否存在
3      bool isExists=wfs.Exists() && DateTime.Now.Subtract(lastWriteTime=wfs.GetLastWriteTime()).TotalDays <= fileKeepDays;
4      lastWriteTime = isExists ? lastWriteTime : DateTime.Now;
5      //設置緩存
6      Response.Cache.SetExpires(lastWriteTime.AddDays(fileKeepDays));
7      Response.Cache.SetLastModifIEd(lastWriteTime.AddMinutes(-1));
8      Response.ContentType = "text/Html";
9      if (!isExists)
10      {
11        try
12        {
13          writer = wfs.GetWriter();
14          //在這裡將頁面內容填寫進去,我一般都是用XSLT來輸出頁面
15        }
16        finally
17        {
18          if (writer != null)
19          {
20            writer.Close();
21          }
22          wfs.Dispose();
23        }
24      }
25      wfs.ResponseFile();
26      wfs.Dispose();

有必要的話再耐心看看我在Web.Config裡面是怎樣配置使用WFS的:

Web.Config

1      <Handler pattern="^/place/cn/((?:[^$/]+/){3})([^$]+).ASPx" handlerType="FFS" useGzip="true" savePath="/place/cn/$1FFS.resx" saveName="$2"/>
2      <Handler pattern="^/place/cn/([^$]+).aspx" handlerType="OS" useGzip="true" savePath="/place/cn/$1.ASPx"/>

以上的配置是為我的地名信息系統設計的,大體意思是:對於前三級行政區劃(省、市、縣),因為訪問次數比較多,考慮到性能,將緩存直接輸出到系統對應的文件,對於後面的所有行政區劃按所在縣的名稱分文件按照結構化存儲。

最後,說說BlueDog的C#類庫的BUG吧,其實說起來很簡單,他可能沒有注意到EnumElements方法產生獲取的ComTypes.STATSTG對象也必須由COM來銷毀,否則,對應的文件操作句柄就沒有被釋放,下次打開文件就會出錯(這個問題折磨了我好久!),受到影響的至少有以下兩個方法(其他方法因為我沒有使用,因此,不知道還有沒有),這兩個方法應該更改為如下:

Strorage.cs Bug Fix

1    public bool IsElementExist(string elementName)
2    {
3      ArgumentValidation.CheckForEmptyString(elementName, "elementName");
4
5      IEnumSTATSTG statstg;
6      ComTypes.STATSTG stat;
7      uint k;
8      this.storage.EnumElements(0, IntPtr.Zero, 0, out statstg);
9      statstg.Reset();
10      bool found = false;
11      while (statstg.Next(1, out stat, out k) == HRESULT.S_OK)
12      {
13        //忽略大小寫比較
14        if (string.Compare(stat.pwcsName, elementName, true) == 0)
15        {
16          found = true;
17          break;
18        }
19      }
20      Marshal.ReleaseComObject(statstg);//釋放statstg
21      return found;
22    }
23    public List<StgElementInfo> GetChildElementsInfo()
24    {
25      IEnumSTATSTG statstg;
26      ComTypes.STATSTG stat;
27      uint k;
28      List<StgElementInfo> list = new List<StgElementInfo>();
29      this.storage.EnumElements(0, IntPtr.Zero, 0,out statstg);
30      statstg.Reset();
31      while (statstg.Next(1, out stat, out k) == HRESULT.S_OK)
32      {
33        list.Add(new StgElementInfo(stat));
34      }
35      Marshal.ReleaseComObject(statstg);//釋放statstg
36      return list;
37    }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved