Visual Fox Pro 文件访问
Posted
技术标签:
【中文标题】Visual Fox Pro 文件访问【英文标题】:Visual Fox Pro file access 【发布时间】:2017-05-25 00:19:00 【问题描述】:我有一个函数可以创建包含一些数据的 .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
【问题讨论】:
您可以粘贴您正在执行的创建 XML 文件并尝试删除的代码吗?使用 CursorToXML() 或使用 XMLAdapter 类是低级还是简单? 我编辑了第一篇文章,添加了一些代码部分,现在可能更清楚了。 您的代码似乎在 VFP 中以最快的方式执行此操作。我认为您应该提供有关文件及其相关性的信息。不过需要注意的是,使用 m.fHandle 代替 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
Done... 让 VFP 处理写入的低级打开和关闭。
【讨论】:
我根本不建议这样做。 VFP 中的字符串操作很慢,一遍又一遍地添加字符串只会消耗更多内存。与 Fputs() 方法相比,这种方法可能会失败很多。 还有其他想法吗? @The50,我已经在你的帖子下添加了评论。你正在做的似乎已经是最快的方法了。为了以不同的方式创建 xml,您可以使用 XMLAdapter 类(cursortoxml 不会按原样提供帮助),但如果它使用 FPuts() 挂起,那么您首先应该了解它为什么会挂起。以上是关于Visual Fox Pro 文件访问的主要内容,如果未能解决你的问题,请参考以下文章
转帖通过PHP读取dbf数据(visual fox pro,VFP数据库),官方的dbase无法读取字段为类型memo的数据,国外网站的解决方案 How to read FoxPro Memo w(代
苹果紧急修复 macOS 漏洞 / 新 iPad Pro 或将支持面容 ID / 曝迪士尼收购 20 世纪 FOX |灵感早读