Visual Fox Pro文件访问

时间:2017-01-10 13:28:41

标签: visual-foxpro filelock

我有一个函数whitch创建.xml文件,里面有一些数据。每次首先删除旧文件。一切都很好,除了它有时会被冻结,文件本身被锁定。它的大小为0 kb,程序甚至无法删除它。我必须杀死进程,自己删除文件,然后再次运行程序。是否可以在新程序开始之前杀死同一程序的所有进程?或者至少在它上面放一些计时器以确保它在经过一段时间后自动关闭?

需要一些想法,谢谢。

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

1 个答案:

答案 0 :(得分: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处理低水平的开放和关闭。