2016-09-28 143 views
0

我在更改某些值後保存xml文件時遇到問題。 我使用的拉撒路1.6作爲IDE與FPC版本3.0.0 這裏是我的xml文件的結構,我用了這個帖子:如何使用Lazarus將TFilestream保存到硬盤驅動器

<?xml version="1.0" encoding="UTF-8"?> 
<wbpickeys> 
    <picture> 
    <name>C:\IMG_1.JPG</name> 
    <imagedate>p-06/04/2014 16:22:10</imagedate> 
    <favorit>n</favorit> 
    <remark>aaa</remark> 
    <drive>DRIVE_FIXED</drive> 
    </picture> 
</wbpickeys> 

我用下面的使用條款(可能不是所有的人都必要的,但我認爲至少一次重要的是可用):

uses 
Windows, ShellAPI, FileUtil, Graphics, Menus, ComCtrls, ExtCtrls, ExtDlgs, Classes, SysUtils, LResources, Forms, Controls, StdCtrls, Dialogs, CheckLst, Buttons, inifiles, 
laz2_DOM, laz2_XMLRead, laz2_XMLWrite, laz2_XMLCfg, laz2_XMLUtils, laz_XMLStreaming; 

在程序啓動我這個XML文件加載到TFileStream的(g_stream:TFileStream的)。原因是在程序運行期間擁有獨家訪問權限。 要做到這一點我用下面的open函數:

function open_xml:Boolean; 
begin 
    if g_stream <> nil then FreeAndNil(g_stream); 
    try 
      //with load from (TFile)-Stream the xml file can be opened with Share Exclusive 
      //when loading only from file there is no possibility to open it exclusive 
      g_stream:= TFileStream.Create('wbpickeys.xml',fmShareExclusive); 
      //Read the XML file into an XML Document 
     readxmlfile(g_wbpickeys,g_stream); 
      result:= true; 
    except 
     on E:EFOpenError do 
     begin 
      beep(); 
       MessageDlg 
     (
      //br is defined as a constance for line feed 
     '*** A T T E N T I O N ***' + br + br + 
      'When trying to open the file for the keywords' + br + '"wbpickeys.xml"' + br + 
      'the following error occurs:' + br + 
      E.Message + br + 
      'Please check if the file is available' + br + 
      'or deleted or moved or what else',mtError,[mbOK],0 
     ); 
     result:= false; 
     end; 
    end; 
end; 

比我改變一個childnode的文本值:

procedure TForm1.BChangeNodeClick(Sender: TObject); 
var 
    pictures   : TDOMNodeList; 
    pic, tempnode  : TDOMNode; 
    i     : integer; 
begin 
    // Get all nodes with name "picture" 
    pictures:= g_wbpickeys.GetElementsByTagName('picture'); 
    // For all Member nodes 
    for i:= 0 to pictures.Count - 1 do 
    begin 
    pic:= pictures[i]; 
    tempnode:= pic.FindNode('remark'); 
    // if content is 'bbb' change it 
    if(tempnode.TextContent = 'bbb') then 
    begin 
     tempnode.TextContent:= 'aaa'; 
     //than I try to save the xmldocument to the hard drive  
     writeXMLFile(g_wbpickeys,'wbpickeys.xml'); 
    end; 
end; 

這裏是我的問題: 新文本設置和我能夠在備忘錄中看到結果。但是這個值只在運行時加載xml的內存中發生了變化,而物理上並沒有在硬盤上的文件中發生。 我看起來幾乎遍佈網絡,但我無法找到解決方案將流保存到硬盤驅動器上相應的文件。

如果我用這個 「writeXMLFile(g_wbpickeys, 'wbpickeys.xml');」 我得到一個EFCreateError「無法創建文件wbpickeys.xml」文件lazutf8classes.pas線143

問題是我不想創建一個XML文件 - 我想改變一個現有的。

比我查找的可能性將流保存到磁盤上的文件。不幸的是,我沒有找到任何東西。

肯定我犯了一個錯誤,但我看不到它。有人可以讓我知道嗎?

+0

創建另一個文件流並複製到該流 –

回答

1

將修改後的文檔寫回磁盤時,必須替換整個文件,不能將操作限制爲僅修改節點。因此,您必須先刪除舊的xml文件(或者更好:重新命名它,以防寫入過程中出現問題),然後使用WriteXMLFile編寫文檔。或者寫入一個新的臨時文件名,以便始終鎖定原始文件;然後銷燬閱讀流(以結束獨佔訪問),刪除原始文件並將新文件重命名爲舊文件。

+0

哇 - 這聽起來真的很複雜。 Bevor我使用了Delphi,並且更容易。但好的,非常感謝那個迴應! –

+0

複雜嗎?我無法想象如何簡化這一點。我無法想象德爾福原則上可以如何做到這一點。 –

+0

我不是真正的專家,但我想用delphi和writeXML函數沒有創建xml,但是這個函數改變了現有的文件。可能是在後臺做的功能相同 - 刪除現有的功能並寫入一個新功能。但是,這不會讓用戶考慮它。無論如何 - 我遵循你的建議,它的工作。非常感謝 Andreas –