2017-01-10 54 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()懸掛,那麼首先應該明白爲什麼它首先掛起。 –