如何用VFP读写配置文件(.INI)?

本文介绍了如何使用VFP(Visual FoxPro)进行.INI配置文件的读写操作。通过示例代码展示了读取INI文件到游标,以及利用Win32API DLL函数进行写入和读取配置信息的方法。

如何用VFP读写配置文件(.INI)?

---------------------------------------------------------------

******读写(读取) INI 文件内容
--------------------------------

******以下是一个读取INI文件的例子1*******

* Reading an arbitrary INI file into a cursor 
* 读一个 INI 文件到一个游标
Local lcFileName
lcFileName = getfile("ini")
Create CURSOR csResult (section C(50), keyname C(50),keyvalue C(200))
lcSections = getSections (lcFileName)
= str2cursor (lcSections, "csSections")
Select csSections
Scan ALL
Select csSections
lcKeys = getKeys (lcFileName, csSections.strvalue)
= str2cursor (lcKeys, "csKeys")
Select csKeys
Scan ALL
lcValue = getKeyValue (lcFileName,csSections.strvalue, csKeys.strvalue)
Insert INTO csResult VALUES (csSections.strvalue, csKeys.strvalue, lcValue)
Endscan
Endscan
Select csResult
Go TOP
Browse NORMAL NOWAIT
FUNCTION getSections (lcFileName)
Declare INTEGER GetPrivateProfileString IN kernel32 INTEGER lpAppName,INTEGER lpKeyName,STRING lpDefault,STRING @ lpReturnedString,INTEGER  nSize,STRING lpFileName
Local lnSize, lpReturnedString, lnResult
lnSize = 4096
lpReturnedString = Repli (Chr(0), lnSize)
lnResult = GetPrivateProfileString (0,0,"#empty#",@lpReturnedString,lnSize,lcFileName)
Return  Left (lpReturnedString, lnResult)
ENDFUNC
FUNCTION getKeys (lcFileName, lcSection)
Declare INTEGER GetPrivateProfileString IN kernel32 STRING lpAppName,INTEGER lpKeyName,STRING lpDefault,STRING @ lpReturnedString,INTEGER nSize,STRING lpFileName
Local lnSize, lpReturnedString, lnResult
lnSize = 16384
lpReturnedString = Repli (Chr(0),lnSize)
lnResult = GetPrivateProfileString (lcSection,0,"#empty#",@lpReturnedString,lnSize,lcFileName)
Return  Left (lpReturnedString, lnResult)
ENDFUNC
FUNCTION getKeyValue (lcFileName, lcSection, lcKey)
Declare INTEGER GetPrivateProfileString IN kernel32 STRING lpAppName,STRING lpKeyName,STRING lpDefault,STRING @ lpReturnedString,INTEGER nSize,STRING lpFileName
Local lnSize, lpReturnedString, lnResult
lnSize = 16384
lpReturnedString = Repli (Chr(0), lnSize)
lnResult = GetPrivateProfileString (lcSection,lcKey,"#empty#",@lpReturnedString,lnSize,lcFileName)
Return  Left (lpReturnedString, lnResult)
endfunc
FUNCTION str2cursor (lcSource, lcCursor)
Create CURSOR (lcCursor) (strvalue C(250))
Local ii, ch, ss, lnResult
ss = ""
lnResult = 0
For ii=1 TO Len(lcSource)
ch = SUBSTR (lcSource, ii,1)
If ch = Chr(0)
Insert INTO (lcCursor) VALUES (ss)
lnResult = lnResult + 1
ss = ""
Else
ss = ss + ch
Endif
Endfor
Return  lnResult
ENDFUNC
FUNCTION  getWindowsDir
Declare INTEGER GetWindowsDirectory IN kernel32 STRING @lpBuffer,INTEGER nSize
lpBuffer = SPACE (250)
nSizeRet = GetWindowsDirectory (@lpBuffer, Len(lpBuffer))
Return  SUBSTR (lpBuffer, 1, nSizeRet)
ENDFUNC
****************************************



******以下是一个读写INI文件的例子2*******

*-- 定义读应用程序 INI 文件的DLL函数
DECLARE INTEGER GetPrivateProfileString IN Win32API AS GetPrivStr ;
String cSection, String cKey, String cDefault, String @cBuffer, ;
Integer nBufferSize, String cINIFile
*-- 定义写应用程序 INI 文件的DLL函数
DECLARE INTEGER WritePrivateProfileString IN Win32API AS WritePrivStr ;
String cSection, String cKey, String cValue, String cINIFile
&& 调用
&& 以下程序将字符串abc=12,24写入当前目录中的formposi.ini文件中的WindowPositions段中:
LOCAL lcValue,lcEntry
lcEntry = "abc"
lcValue = '12,24'
=WritePrivStr("WindowPositions", lcEntry, lcValue, CURDIR() + "formposi.ini")
&& 以下程序从当前目录中的formposi.ini文件中的WindowPositions段中读取以前保存的字符串,并在wait window中显示出来
LOCAL lcBuffer,lcOldError,lnTop,lnLeft,llError,lnCommaPos,lcEntry
lcEntry = 'abc'
lcBuffer = SPACE(10) + CHR(0)
lcOldError = ON('ERROR')
*-- 在INI 文件中读取窗口位置
IF GetPrivStr("WindowPositions", lcEntry, "", @lcBuffer, LEN(lcBuffer), CURDIR() + "formposi.ini") > 0
*-- 如果分解参数时出现错误,
*-- 忽略该串并使用表单的默认值
ON ERROR llError = .T.
lnCommaPos = AT(",", lcBuffer)
lnTop = VAL(LEFT(lcBuffer, lnCommaPos - 1))
lnLeft = VAL(SUBSTR(lcBuffer, lnCommaPos + 

 
<think>嗯,用户这次的问题很明确,就是要找能兼容Visual FoxPro .dbf文件的开源工具或替代方案。从对话历史看,用户之前已经在询问VFP官方下载渠道,现在转向开源解决方案,说明可能是开发者或需要处理遗留系统的技术人员。 用户提供的两个引用很有价值。引用[1]提到C#操作VFP的几种方案,特别是VFPOLEDB和ODBC驱动;引用[2]则展示了JDBC连接DBF的代码示例。这些信息可以整合进回答。 用户可能面临的实际场景是:需要维护或迁移旧的VFP系统,但不想依赖已停产的商业软件。深层需求可能包括:数据迁移的完整性、新方案的长期可持续性、以及避免版权风险。 关于开源替代品,需要考虑几个维度:是否支持DBF读写、是否提供编程接口、能否处理索引文件(CDX)、是否支持SQL查询等。XBase系列工具是首选,因为DBF本就是XBase标准格式。特别要注意VFP特有的字段类型(如货币型)可能不被完全支持。 Harbour和xHarbour这类编译器方案适合需要完整替代VFP开发环境的用户,而Python的dbfread/dbf库更适合简单数据提取。对于需要SQL查询的场景,SQLite虚拟表或Apache Derby可能是折中方案。 最后要提醒用户注意编码问题——VFP的DBF常用ANSI编码,而现代工具默认UTF-8,这可能是数据乱码的隐患。另外DBF文件锁机制差异也可能导致并发问题。</think>以下是兼容Visual FoxPro .dbf文件的开源替代方案和工具,按使用场景分类整理: --- ### 🛠️ 一、核心开源工具库 #### 1. **XBase系列工具 (推荐)** - **dbf** (Node.js) 支持.dbf文件读写和索引操作 ```bash npm install dbf ``` ```javascript const { Table } = require('dbf'); const table = new Table('data.dbf'); table.records.forEach(record => console.log(record.NAME)); ``` - **dbfpy** (Python) 支持.dbf/.dbt文件处理 ```python from dbf import Table with Table('file.dbf') as table: for record in table: print(record['FIELD']) ``` - **DBF.NET** (.NET平台) 支持Memo字段和索引 ```csharp var table = new DbfTable("data.dbf"); foreach (DbfRecord record in table.Records) { Console.WriteLine(record["DATE_FIELD"].GetDate()); } ``` #### 2. **数据库引擎替代品** - **Harbour** - 开源Clipper/xBase兼容语言 - 支持.dbf/.ntx/.cdx索引 - 可编译为跨平台应用 ```harbour USE data.dbf DO WHILE !EOF() ? FIELD->Name SKIP ENDDO ``` - **Apache Derby** + **dbfJDBC** JDBC驱动实现SQL查询DBF ```java Class.forName("com.googlecode.dbfjdbc.DbfJdbcDriver"); Connection conn = DriverManager.getConnection("jdbc:dbf:/path/to/files"); ``` --- ### ⚙️ 二、迁移与转换工具 | 工具 | 功能 | 命令示例 | |----------------------|--------------------------|-----------------------------| | **dbf2sqlite** | DBF→SQLite转换 | `dbf2sqlite -i data.dbf -o db.sqlite` | | **csvkit** (Python) | DBF→CSV/JSON | `in2csv data.dbf > data.csv` | | **LibreOffice Base** | 图形化导入DBF+ODBC连接 | 支持直接打开.dbf文件编辑 | --- ### 🔍 三、特殊场景解决方案 1. **Web应用访问** - 使用 **Node.js + dbf** 构建REST API: ```javascript app.get('/dbf', (req, res) => { const table = new Table('data.dbf'); res.json(table.records); }); ``` 2. **Excel替代方案** - **Gnumeric** (开源电子表格) 原生支持.dbf文件编辑和公式计算 3. **内存数据库** - **SQLite 虚拟表** 通过[dbfvfs](https://github.com/whitelynx/dbfvfs)扩展直接挂载DBF目录 ```sql SELECT * FROM vtab_dbf WHERE dept = 'SALES'; ``` --- ### ⚠️ 重要注意事项 1. **编码问题** VFP常用`CP936`(GBK)编码,现代工具默认UTF-8,需显式指定: ```python table = Table('data.dbf', encoding='gbk') # Python示例 ``` 2. **字段类型差异** | VFP类型 | 开源库处理建议 | |--------------|----------------------| | 货币(Currency)| 转换为DECIMAL(19,4) | | 通用(General) | 需提取OLE对象二进制 | 3. **索引兼容性** - `.cdx`复合索引需用**Harbour**或**Xbase++**处理 - 简单查询建议用代码过滤: ```javascript // dbf库的索引替代方案 const filtered = table.records.filter(r => r.AGE > 30); ``` --- ### 🔗 资源参考 - [dbf库文档](https://github.com/totaljs/dbf) - [Harbour项目官网](https://harbour.github.io/) - [DBF格式规范](http://www.dbase.com/Knowledgebase/INT/db7_file_fmt.htm) [^1] ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值