處理 ini檔 の 最終奥義 |
|
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
前提:如果你只想單純的從ini檔裡讀/寫幾個選項, 而且誓死不換TIniFile的用法, 那此篇文章您就可以省略不看. 狀況1:我想對ini檔裡面的選項要作排序時, TIniFile可以達到要求嗎?
狀況2:我想對ini檔裡的第Index個字串, 作個別處理時, TiniFile可以作到嗎? 也許有人會說, 那怎麼不自己使用TStringList另外作掉就好? Good question
說到此, 我先列一下> > 原由: 因為我想要對>> 兩者混用
原來, 你打開 > 寫到此, 看倌應該還看不出兩者混用的最大好處在那. 只知道有 class="code">
String IniFileName=ExtractFilePath(ParamStr(0)) "MyText.ini";
TStringList *FileList=new TStringList();
TMemIniFile *IniMemory=new TMemIniFile(""); // 為什麼不給檔名? 因為給了檔名也Load不進File, 乾脆用空字串, 讓Compiler pass, 而且也不用記檔名 ^^"
if (FileExists(IniFileName))
FileList->LoadFormFile(IniFileName);
IniMemory->SetStrings(FileList); // 注意: 要把TStringList的內容塞到TMemIniFile, 居然是用SetStrings而不是GetStrings喔, 反之亦同
2) 第1個步聚作完後, 我想, 你想要讀到第Index個ini檔的字串, 你覺得還是個問題嗎? 只要使用FileList->Strings[Index] 就可以搞定了
而且如果你使用> >, 因為真的是在 class="code">
FileList->Clear(); // 是見鬼了喔? 為什麼一定要Clear?
// 經過小弟實作的結果...使用IniMemory->SetString(FileList);時, 居然會先自動清掉IniMemory的data, 然後再把TStringList的內容存入TMemIniFile;
// 然而, IniMemory->IniMemory->GetString(FileList), 居然不會先清掉TStringList裡的內容, 而是累加上去, 所以如果你要完整呈現TMemIniFile裡的內容, 就先把TStringList的內容清掉
IniMemory->GetString(FileList);
ShowMessage(FileList->Text);
4)怎麼寫一個概念中WriteSectionValues的動作呢?
// 假設你在這之前已經把IniMemory和FileList的內容都弄成相同了 TStringList *SortList=new TStringList(); IniMemory->ReadSectionValues("SectionName1", SortList); .......//處理完你要對自己SectionName1裡整塊選項的字串, 比如說排序.... int Index=FileList->IndexOf("SectionName1"); for (int i=0; i5) 當你排完序, 或是處理完所有的data後, 要把內容寫回ini檔時, 可以這樣子作 FileList->SaveToFile(IniFileName); 以上的混用法. 1. 保證HDD只有被access兩次, 第一次在FileList->LoadFromFile, 第二次在FileList->SaveToFile(IniFileName); 假使你是使用TIniFile, 嘿嘿...那HDD絕對被access兩次以上 2. 完全在Memory裡運作, 速度相當的快, 不用為了讀檔/存檔不一致性, 讓程式更有條理, 因為都是在Memory運作 有一點讓我不解的是...用TMemIniFile寫入的字串, 比用TIniFile寫入得字串, 在每個Section的最後面會多一行空白字串 @@~ 只有這點怪怪的< > 以上是小弟的淺見, 如有任何不妥之處, 請不吝賜教< > 經過RaynorPao版主的腦筯激盪....給了TMemIniFile TStringList另外一個重大的任務...那就是===>Ini檔加/解密, 是不是很容易就可以完成啦? 發表人 - |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
記得去年我就對 TMemIniFile 很有興趣,參考:
■ 如何更新內建 VCL 元件
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=18519 後來因為工作上的需要已完全改寫了 TMemIniFile 。
如果認為 TMemIniFile 的行為異常,可以參考它的 source 會比較了解,當然是 Delphi 的 code 對於 BCB 的用戶較為吃力... 這篇文章似乎是我看過單日點選最多的一篇,才一天不到就有 500 多人次的點閱 <>沒空更新的網頁...
href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
|
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
|
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
|
circusmonkey
一般會員 發表:6 回覆:10 積分:8 註冊:2004-06-28 發送簡訊給我 |
我不是很同意 TMemIniFile 这个控件。理论上说,一次性读入所有内容,可以
提高性能。但是如果用 TMemIniFile 来替代 TIniFile 还是不行。理由有如下
这些:
1. 由于是内容读写都在内存中进行。如果同时有2个 TMemIniFile 同时打开一
个文件,那么 A实例对文件的改动根本不会被 B实例发现。很容易造成文件
内容的混乱。
2. 如果在运行程序的过程中出现了非法操作,可能所有内容因为尚未保存而随
之丢失。
3. 其实读取单条记录的话,由于 TIniFile 是调用了 API函数,所以速度肯定
比 TMemIniFile 要快。因为后者必须先读取整个文件。我做过测试,可能后
者的速度优势在读取了51条记录后体现。但倘若前者使用
ReadSection/ReadSectionValue 而非 ReadString,那么他的速度与后者相
当。
4. 还有其它很多小问题,比如排版格式,注释行,等等问题,会在
TMemIniFile 中陆续出现。 综上所述,我认为合理使用 TIniFile 是正解。当然目前 TIniFile 没有提供
WriteSection/WriteSectionValue 的确是个性能瓶颈。但这个应该不难解决。 我在选择使用标准的 TIniFile 还是使用 TMemIniFile/TStringList 问题上,
几经周折。如果对我上述发言,有讨论、反对或者补充的,非常欢迎。 發表人 - circusmonkey 於 2004/11/10 07:03:48
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |