2017-01-10 53 views
0

我有一个函数可以创建包含一些数据的.xml文件。每次首先删除旧文件。一切工作正常,除了它有时被冻结,文件本身被锁定。它的大小是0 kb,程序甚至不能删除它。我必须杀死进程,自己删除文件,然后再次运行程序。是否有可能在开始新程序之前杀死同一程序的所有进程?或者至少在其上放置一些定时器以确保它在一段时间过后自动关闭?Visual Fox Pro文件访问

需要一些想法,谢谢。

fHandle = f_cFile("D:\Data\new_eur\Saskaitos.xml") 
if fHandle < 0 
**=messagebox("Can't create file!",16,"!!!") 
=STRTOFILE("Can't create XML file" + CHR(13) + CHR(10), "d:\Log.txt", 1) 
quit 
ENDIF 

** Header 
if fputs(fHandle, '<?xml version="1.0" encoding="windows-1257"?>') < 0 
=fclose(fHandle) 
=STRTOFILE("Can't write to XML file" + CHR(13) + CHR(10), "d:\Log.txt", 1) 
quit 
endif 

=STRTOFILE(TTOC(dateTIME()) + ": " + "XML ok"+CHR(13)+CHR(10), "d:\LogData.txt", 1) 
=fputs(fHandle, "<Accounts>") 

enteris = CHR(13) 
DO WHILE NOT EOF() 
=fputs(fHandle, "<Detali>") 
=fputs(fHandle, "<Snr><![CDATA[" + ALLTRIM(Data.dok_nr) + "]]></Snr>" + enteris) 
=fputs(fHandle, "<Code_ks><![CDATA[" + ALLTRIM(Data.Code_ks) + "]]></Code_ks>" + enteris) 
=fputs(fHandle, "<Sdata>" + ALLTRIM(Data.dok_data) + "</Sdata>" + enteris) 
=fputs(fHandle, "<Term>" + ALLTRIM(Duomenys.Terminas) + "</Term>" + enteris) 
=fputs(fHandle, "<Manager><![CDATA[" + ALLTRIM(Data.Code_ms) + "]]></Manager>" + enteris) 
IF Data.val_poz = 0 
    =fputs(fHandle, "<MokSuma>" + ALLTRIM(STR(Duomenys.SumaMok, 12, 2)) + "</MokSuma>" + enteris) 
    =fputs(fHandle, "<ApSuma>" + ALLTRIM(STR(Duomenys.ApSuma, 12, 2)) + "</ApSuma>" + enteris) 
ELSE 
    =fputs(fHandle, "<MokSuma>" + ALLTRIM(STR(Duomenys.SumaVal, 12, 2)) + "</MokSuma>" + enteris) 
    =fputs(fHandle, "<ApSuma>" + ALLTRIM(STR(Duomenys.ApVal, 12, 2)) + "</ApSuma>" + enteris) 
ENDIF 
=fputs(fHandle, "</Detali>")  
skip 
ENDDO 
fputs(fHandle, "</Accounts>") 
=fclose(fHandle) 

现在这是将xml数据放入文件的代码。在某个时候,它会冻结,下一次程序启动时它仍然使用相同的文件。

功能f_cFile:

FUNCTION f_cFile 
PARAMETERS fName 
fHandle = fcreate(fName) 
IF fHandle < 0 
    IF FILE(fName,1) 
     DELETE FILE fName 
     IF FILE(fName,1) 
      =STRTOFILE("Can't delete old file: " + fName + CHR(13) + CHR(10), " d:\Log.txt", 1) 
     ELSE  
      fHandle = fcreate(fName)   
     ENDIF 
    ENDIF 
ENDIF 
RETURN fHandle 
ENDFUNC 
+0

你能粘贴你正在做的代码来创建XML文件并尝试删除吗?使用CursorToXML()还是使用XMLAdapter类,它是低级的还是简单的? – DRapp

+0

我编辑了第一篇文章,添加了一些代码部分,可能现在更清楚。 – The50

+0

您的代码似乎正在以VFP中最快的方式进行。我想你应该提供关于这些文件的信息以及它们是如何相关的。但请注意,不是fHandle,而是使用m.fHandle。您不需要'enteris'变量,Fputs()会自动添加CR(chr(13))和LF(chr(10))。奇怪的是,这段代码挂起(提醒我数据在远程机器上,网络非常慢 - 那么我完全不信任使用File())。 –

回答

1

哇...许多其他选项来简化您的锁定问题。首先在不改变你的东西太多是通过串打造...让一个变量,并保留追加到它,直到你完成,然后使用一个写命令写如..

enteris = CHR(13) 
myXML = '<?xml version="1.0" encoding="windows-1257"?>' + enteris; 
     + "<Accounts>" 

SCAN 
    myXML = myXML + "<Detali>"; 
      + "<Snr><![CDATA[" + ALLTRIM(Data.dok_nr) + "]]></Snr>" + enteris; 
      + "<Code_ks><![CDATA[" + ALLTRIM(Data.Code_ks) + "]]></Code_ks>" + enteris; 
      + "<Sdata>" + ALLTRIM(Data.dok_data) + "</Sdata>" + enteris; 
      + "<Term>" + ALLTRIM(Duomenys.Terminas) + "</Term>" + enteris; 
      + "<Manager><![CDATA[" + ALLTRIM(Data.Code_ms) + "]]></Manager>" + enteris 

    IF Data.val_poz = 0 
     myXML = myXML + "<MokSuma>" + ALLTRIM(STR(Duomenys.SumaMok, 12, 2)) + "</MokSuma>" + enteris; 
       + "<ApSuma>" + ALLTRIM(STR(Duomenys.ApSuma, 12, 2)) + "</ApSuma>" + enteris 
    ELSE 
     myXML = myXML + "<MokSuma>" + ALLTRIM(STR(Duomenys.SumaVal, 12, 2)) + "</MokSuma>" + enteris; 
       + "<ApSuma>" + ALLTRIM(STR(Duomenys.ApVal, 12, 2)) + "</ApSuma>" + enteris 
    ENDIF 
    myXML = myXML + "</Detali>"; 
ENDSCAN 

myXML = myXML + "</Accounts>" 

if StrToFile(myXML, "D:\Data\new_eur\Saskaitos.xml") = 0 
    =STRTOFILE("Can't create XML file" + CHR(13) + CHR(10), "d:\Log.txt", 1) 
endif 

做..让VFP处理写作的底层开放和结束。

+0

我不会建议这样做。 VFP中的字符串操作很慢,并且反复添加字符串只会消耗更多内存。与Fputs()方法相比,这种方法很可能会失败很多。 –

+0

还有其他想法吗? – The50

+0

@ The50,我已在你的帖子下添加评论。你正在做的事似乎是已经做到最快的方法。为了以不同的方式创建xml,可以使用XMLAdapter类(cursortoxml不会如此),但是如果使用FPuts()悬挂,那么首先应该明白为什么它首先挂起。 –