关于文件操作的问题!(好人啊,快来帮帮我这个初学者吧)

challenge8 2003-10-07 07:04:58
这个问题已经烦了我几天了,就是解决不了,大侠你快点救我啊!

● 我写的小程序功能如下:

1.界面Network.exe中有两个TextBox(txt_ip、txt_port),用户可以通过这两个 TextBox往文件config.txt中写入两行参数:
Server 服务IP地址(如:192.168.0.10)
Listen 服务端口号(如:8080)


2.用户也可以通过界面Network.exe来修改这两行参数,用户打开Network.exe时,两个TextBox会自动读入以前配置的两行参数,即:txt_ip_Text=192.168.0.10,txt_port.Text=8080

● 写文件config.txt的代码:

Dim Save_ip, Save_port As String
Save_ip = Form1.txt_ip.Text
Save_port = Form1.txt_port.Text
Open App.Path & "\config.txt" For Append As #1
Print #1, "#Server and port Configuration"
Print #1, "Server " & Save_ip
Print #1, "Listen " & Save_port
Close #1

● 我的问题如下:
当文件config.txt中没有这两行参数时,我直接用Append增加就行了,但是如果参数已经存在,这两行参数对我来说将是不确定的(比如服务端口号可能是8080,也可能是6060),我该如何把参数分别读入到两个TextBox中?如何修改config.txt中的两行参数?
...全文
86 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunfeng007 2003-10-07
  • 打赏
  • 举报
回复
同意楼上的,用ini文件读写。当然你也可以用注册表
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA"
(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA"
(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
'---------------例子--------------------
Option Explicit
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006

Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA"
(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Sub Main()
Dim ret As Long, hKey As Long, hKey2 As Long
ret = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft", hKey)
If ret = 0 Then
MsgBox "HKLM\SOFTWARE\Microsoft = " & hKey
End If

ret = RegOpenKey(hKey, "Windows\CurrentVersion", hKey2)
If ret = 0 Then
MsgBox "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion = " & hKey2
End If


'Use RegCreateKey function to create subkey "HKEY_LOCAL_MACHINE\SOFTWARE\Hongqt"
ret = RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Hongqt", hKey)
If Not ret Then
MsgBox "Create HKEY_LOCAL_MACHINE\SOFTWARE\Hongqt SubKey Success"
Else
MsgBox "Create Subkey Operation Fail"
End If

RegCloseKey hKey
RegCloseKey hKey2
End Sub

射天狼 2003-10-07
  • 打赏
  • 举报
回复
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Private Sub Form_Load()
Open "C:\aa.ini" For Output As #1
Print #1, "文件内容"
Close #1
End Sub

Private Sub Label1_Click()
On Error GoTo Errhandle
ShellExecute Me.hwnd, "open", "www.sohu.com", vbNullString, vbNullString, 1
Exit Sub
Errhandle:
MsgBox Err.Description & "!", vbInformation
End Sub

'写INI文件
Private Sub Command1_Click()
Dim Counter As Long

For Counter = 1 To 4
Call WriteToIni(App.Path & "\Options.ini", "Test", "Name" & Counter, "Value" & Counter)
Next Counter
End Sub

'读INI文件
Private Sub Command2_Click()
Dim Counter As Long
Dim Value(3) As String

For Counter = 1 To 4
Value(Counter - 1) = ReadFromIni(App.Path & "\Options.ini", "Test", "Name" & Counter)
Next Counter
End Sub
佛的光辉 2003-10-07
  • 打赏
  • 举报
回复
将你的参数保存为ini文件的格式,用一下几个api函数读写,很方便的
Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As Long
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
felix 2003-10-07
  • 打赏
  • 举报
回复
'将Append改成Output即可实现修改,因为每次打开该文件都会将其清空
Dim Save_ip, Save_port As String
Save_ip = Form1.txt_ip.Text
Save_port = Form1.txt_port.Text
Open App.Path & "\config.txt" For Output As #1
Print #1, "#Server and port Configuration"
Print #1, "Server " & Save_ip
Print #1, "Listen " & Save_port
Close #1
'读取数据
Dim sHead, Save_ip, Save_port As String
Dim i As Integer
Open App.Path & "\config.txt" For Input As #1
Input #1, sHead, Save_ip, Save_port
i = InStr(1, Save_ip, " ", vbTextCompare)
Save_ip = Mid(Save_ip, i + 1)
i = InStr(1, Save_port, " ", vbTextCompare)
Save_port = Mid(Save_port, i + 1)
Form1.txt_ip.Text = Save_ip
Form1.txt_port.Text = Save_port
Close #1
zjcxc 2003-10-07
  • 打赏
  • 举报
回复
'运行程序时,调用函数读取保存的值
Private Sub Form_Load()
txt_ip = fRead("ServerName")
txt_ip.Tag = txt_ip

txt_port = fRead("Listen")
txt_port.Tag = txt_port
End Sub

'退出程序时,判断数据是否改变,如果改变,保存数据,也可以改成相应的按纽命令
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If txt_ip.Tag <> txt_ip Or txt_port.Tag <> txt_port Then
If MsgBox("数据已经改变,是否保存?", vbQuestion + vbYesNo) = vbYes Then
If txt_ip.Tag <> txt_ip Then
sWrite "ServerName", txt_ip
End If
If txt_ip.Tag <> txt_ip Or txt_port.Tag <> txt_port Then
sWrite "Listen", txt_port
End If
End If
End If
End Sub

zjcxc 2003-10-07
  • 打赏
  • 举报
回复
'用下面的函数

'获取临时文件相关
Public Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Public Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long

'得到临时文件名
Public Function fGetTempFileName(ByVal sFileHeader$) As String
Dim iReturn As String, iTmpL&
Dim iDriveName As String * 256
iTmpL = GetTempPath(256, iDriveName) 'App.Path
GetTempFileName Left(iDriveName, iTmpL), sFileHeader, 0, iDriveName
iReturn = Left$(iDriveName, InStr(iDriveName, Chr(0)) - 1)
If Dir(iReturn) <> "" Then Kill iReturn
fGetTempFileName = iReturn
End Function

'得到config.txt文件位置,默认的位置在程序目录下
Public Function fGetDefaultFilename$()
Dim iReturn$
iReturn = App.Path
If Right(iReturn, 1) <> "\" Then iReturn = iReturn & "\"
iReturn = iReturn & "config.txt"
iReturn = "c:\config.txt"

fGetDefaultFilename = iReturn
End Function

'读取文件内容
Public Function fRead$(ByVal sKey$ _
, Optional ByVal sDefault$ = "" _
, Optional ByVal sFileName$ = "")

Dim iFn&, iStr$, iReturn$
Dim iHead$

'定义判断数据的起点
iHead = "#Server and port Configuration"

'检查要读取的文件
If sFileName = "" Then sFileName = fGetDefaultFilename
If Dir(sFileName) = "" Then GoTo lbExit

'打开文件
iFn = FreeFile
Open sFileName For Input As iFn

'读取内容
sKey = sKey & "*"
Do While Not EOF(iFn)
Line Input #iFn, iStr
If Trim(iStr) = iHead Then
Do While Not EOF(iFn)
Line Input #iFn, iStr
iStr = LTrim(iStr)
If iStr Like sKey Then
iReturn = RTrim(Mid(iStr, Len(sKey)))
GoTo lbOk
End If
Loop
End If
Loop

lbOk:
'关闭文件
Close iFn

lbExit:
fRead = IIf(iReturn = "", sDefault, iReturn)
End Function

'写文件内容
Public Sub sWrite(ByVal sKey$ _
, ByVal sValue$ _
, Optional ByVal sFileName$ = "")

Dim iFnR&, iFnW&, iTmpFn$, iStr$
Dim iHead$

'定义判断数据的起点
iHead = "#Server and port Configuration"

'检查要写的文件
If sFileName = "" Then sFileName = fGetDefaultFilename

'打开要写的文件
If Dir(sFileName) = "" Then '如果不存在,创建文件
iFnW = FreeFile
Open sFileName For Output As iFnW
GoTo lbprint
Else
'打开写入文件
iTmpFn = fGetTempFileName("zj")
iFnW = FreeFile
Open iTmpFn For Output As iFnW

'打开读取文件
iFnR = FreeFile
Open sFileName For Input As iFnR
End If

'替换相应内容
Do While Not EOF(iFnR)
Line Input #iFnR, iStr
If Trim(iStr) = iHead Then
Print #iFnW, iStr
iHead = ""
Do While Not EOF(iFnR)
Line Input #iFnR, iStr
iStr = LTrim(iStr)
If iStr Like sKey & "*" Then '如果已经存在,直接替换相应的内容
Print #iFnW, sKey & " " & sValue
sKey = ""
GoTo lbOk
End If
Print #iFnW, iStr
Loop
Else
Print #iFnW, iStr
End If
Loop

lbOk:
'关闭文件
Close iFnR

lbprint:
'判断那些内容要写
If iHead <> "" Then Print #iFnW, iHead
If sKey <> "" Then Print #iFnW, sKey & " " & sValue
Close iFnW

'如果使用了临时文件,需要将临时文件复制成正式文件
If iTmpFn <> "" Then
Kill sFileName
FileCopy iTmpFn, sFileName
Kill iTmpFn
End If
End Sub


pandengzhe 2003-10-07
  • 打赏
  • 举报
回复
甚末方法都可以,只要格式固定,读出来分解开就行了
challenge8 2003-10-07
  • 打赏
  • 举报
回复
为了这个问题,昨晚一夜都没睡,到中午俺才起床.....

高人啊,我好痛苦啊,快快解救我吧~~~~~~~~~~~~~~~~~
challenge8 2003-10-07
  • 打赏
  • 举报
回复
yunfeng007(一水寒),拜托你给点代码好不好,初学者嘛,你这样说给我听也是白说的 :(
yunfeng007 2003-10-07
  • 打赏
  • 举报
回复
哦,这个配置文件好像是xml格式的吧,你引用xml 3.0,然后对xml进行读写。
challenge8 2003-10-07
  • 打赏
  • 举报
回复
众位,是我没有把问题表达清楚,害得大伙白忙一顿,对不住了!我把我的问题再表达一遍:

有一个Apache服务器配置文件config.conf,我需要对其进行读写操作,该文件的部分内容如下:

LoadModule php4_module C:/FZOA/bin/sapi/php4apache2.dll
AddType application/x-httpd-php .php
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php4

DirectoryIndex index.php
DirectoryIndex index.php3
DirectoryIndex index.php4

#Server and port Configuration
ServerName 192.168.1.3
Listen 8888

===============================================================================
问题来了:
1.为了让用户知道他之前配置的参数,如何将参数192.168.1.3和8888分别读入两个TextBox中(txt_ip、txt_port)??
2.如何修改这些参数(ServerName后面的IP地址192.168.1.3和Listen后面的端口号8888)??

请注意:
1.行ServerName 192.168.1.3和行Listen 8888在文件中的具体行数是不确定的,只知道这两行一定紧跟在#Server and port Configuration的后面
2.ServerName后面的IP地址和Listen后面的端口号由用户输入,也是不确定的

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧