我在更改某些值後保存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文件 - 我想改變一個現有的。
比我查找的可能性將流保存到磁盤上的文件。不幸的是,我沒有找到任何東西。
肯定我犯了一個錯誤,但我看不到它。有人可以讓我知道嗎?
創建另一個文件流並複製到該流 –