为什么总是提示“File already open” ???

湘王AI
聚能技术官方账号
2006-03-06 03:12:00
Open (filename) For Input As #1
Do While Not EOF(1)
Line Input #1, Intext
logFile = logFile + Intext + vbCrLf
Loop
Close #1

logFile = logFile & Text1.Text

Open (filename) For Output As #1
Print #1, logFile
Close #1

filename 是从文本框中得到的文件名(需要包含路径吗?),运行时为什么总是提示“File already open”?
...全文
4075 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
湘王AI 2006-03-07
  • 打赏
  • 举报
回复
没有用Open,用
Set fil = fso.CreateTextFile(strFileName, True)
把问题解决了:)
wxrwan 2006-03-06
  • 打赏
  • 举报
回复
可能用其它软件打开了输出文件了吧
feiyun0112 2006-03-06
  • 打赏
  • 举报
回复
不用#1

intFile=FreeFile
用#intFile




**********************************
*本人主要使用VB+MS SQL,C#略知一二
*
*如有相关问题需要帮助
*
*可发短消息告知链接
*
*助人为快乐之本!
**********************************


davysnet 2006-03-06
  • 打赏
  • 举报
回复
我估计是你用别的软件打开那个输出文件了吧,或者进程中有一个未完成的进程,在读写那个文件,但进程以死,你应该试试重起一下,然后再运行。

还有,你应该确定出错的行,你应该运行后,在关键部位都设置中断,看看到底是哪一行执行就出错了,这应该是解决问题的关键。

Input用#1,Output用#2试试
AnnaBear 2006-03-06
  • 打赏
  • 举报
回复
给你个例子
你自己调试看看是不是哪有问题:

Option Explicit

Private Type file_structure
datano As Byte
datatext As String * 30
'datatext(29) As String * 1
intdata As Integer
dbldata As Double
End Type

Dim filedata(4) As file_structure

Private Sub cmdopen_Click()
On Error Resume Next
CommonDialog1.ShowOpen
If Err.Number = 32755 Then
Exit Sub
End If

If IsNull(CommonDialog1.FileName) = True Then
Exit Sub
End If

If InStr(CommonDialog1.FileName, "FileIO") <> 0 Then

Call sdatadisplay

cmdopen.Enabled = False
cmdsave.Enabled = True
End If

End Sub


Private Sub sdatadisplay()

Dim i As Integer
Open CommonDialog1.FileName For Binary As #1
For i = 0 To 4
Get #1, , filedata(i)

MSHFlexGrid1.TextMatrix(i + 1, 0) = filedata(i).datano
MSHFlexGrid1.TextMatrix(i + 1, 1) = filedata(i).datatext
' Dim m As Integer 
' Dim n As String
' For m = 0 To 29
' n = n + filedata(i).datatext(m)
' Next
' MSHFlexGrid1.TextMatrix(i + 1, 1) = n
MSHFlexGrid1.TextMatrix(i + 1, 2) = filedata(i).intdata
MSHFlexGrid1.TextMatrix(i + 1, 3) = filedata(i).dbldata
Next


Close #1

End Sub


Private Sub cmdsave_Click()
On Error Resume Next

CommonDialog1.ShowSave

If Err.Number = 32755 Then
Exit Sub
End If



Call sdatasave
End Sub

Private Sub sdatasave()
Dim i As Integer
Open CommonDialog1.FileName For Binary As #1
For i = 0 To 4
Put #1, Len(filedata(0)) * i + 1, filedata(i)
Next

Close #1
End Sub

Private Sub cmdset_Click()
If CInt(Text1(0).Text) < 0 Or CInt(Text1(0).Text) > 255 Then
Exit Sub
Else
MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 0) = CInt(Text1(0).Text)
filedata(MSHFlexGrid1.Row - 1).datano = CInt(Text1(0).Text)
End If

MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 1) = (Text1(1).Text)
filedata(MSHFlexGrid1.Row - 1).datatext = (Text1(1).Text)

MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 2) = (Text1(2).Text)
filedata(MSHFlexGrid1.Row - 1).intdata = CInt(Text1(2).Text)

MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 3) = (Text1(3).Text)
filedata(MSHFlexGrid1.Row - 1).dbldata = CDbl(Text1(3).Text)

cmdset.Enabled = False


End Sub

Private Sub Form_Load()
Dim i As Integer
For i = 0 To 3
If i <> 1 Then
End If
Next

MSHFlexGrid1.ColWidth(0, 0) = 500
MSHFlexGrid1.ColWidth(1) = 6000


MSHFlexGrid1.TextMatrix(0, 0) = "NO."
MSHFlexGrid1.TextMatrix(0, 1) = "Data Text"
MSHFlexGrid1.TextMatrix(0, 2) = "INTEGER"
MSHFlexGrid1.TextMatrix(0, 3) = "DOUBLE"

CommonDialog1.CancelError = True
CommonDialog1.FileName = "FileIO"
CommonDialog1.Filter = "TEXT FILE(*.TXT)|*.TXT"
CommonDialog1.InitDir = App.Path
End Sub

Private Sub MSHFlexGrid1_Click()
If cmdsave.Enabled = False Then
Exit Sub
End If

Dim i As Integer
'i = MSHFlexGrid1.Row - 1
i = MSHFlexGrid1.Row

Text1(0).Text = MSHFlexGrid1.TextMatrix(i, 0)
Text1(1).Text = MSHFlexGrid1.TextMatrix(i, 1)
Text1(2).Text = MSHFlexGrid1.TextMatrix(i, 2)
Text1(3).Text = MSHFlexGrid1.TextMatrix(i, 3)

'Text1(0).Text = CInt(filedata(i).datano)
'Text1(1).Text = Trim(filedata(i).datatext)
'Text1(2).Text = CInt(filedata(i).intdata)
'Text1(3).Text = CDbl(filedata(i).dbldata)

cmdset.Enabled = True

End Sub
AnnaBear 2006-03-06
  • 打赏
  • 举报
回复
你打开保存那是不是有问题呀
为什么程序保存之后发现根本找不到你保存的文件?
你那能看到保存文件?
湘王AI 2006-03-06
  • 打赏
  • 举报
回复
都用过了,还是不行!可能vb本身有问题
湘王AI 2006-03-06
  • 打赏
  • 举报
回复
颠倒之后还是报相同的错误,所以应该不是这个问题!以前也这样写的,没有问题
AnnaBear 2006-03-06
  • 打赏
  • 举报
回复
对不起,刚才上面说的颠倒位置错了:(领会错你程序的意思了,不好意思。不过我这的确没有出现文件已打开这样的报错;)

这是你的错误提示:
文件已打开(错误 55)


有时候文件必须在其他 Open 或其他操作发生前先关闭。此错误有以下的原因和解决方法:

对一个已经打开的文件,执行顺序输出模式的 Open 语句。
必须将要打开成其他方式的顺序访问方式文件先关闭。例如,必须先将打开成 Input 的文件先关闭再打开成 Output。

如 Kill、SetAttr 或 Name 等语句,引用到一个打开的文件。
在执行此语句前先关闭此文件。
AnnaBear 2006-03-06
  • 打赏
  • 举报
回复
我刚才调试觉得:
文件应该是没有创建的时候先创建呀
你怎么是先读再写呢?是不是这个原因
你把
Open (filename) For Input As #1
Do While Not EOF(1)
Line Input #1, Intext
logFile = logFile + Intext + vbCrLf
Loop
Close #1
logFile = logFile & Text1.Text
Open (filename) For Output As #1
Print #1, logFile
Close #1
读写颠倒一下,先output再input试试
是不是你所要解决的答案?
湘王AI 2006-03-06
  • 打赏
  • 举报
回复
不知道,我把很多不相干的过程都注视掉了,还是报错,真是莫名其妙!:(
AnnaBear 2006-03-06
  • 打赏
  • 举报
回复
奇怪,为什么在我机器上没有你那错误提示?
湘王AI 2006-03-06
  • 打赏
  • 举报
回复
Open如果在打开时没有发现指定的文件,应该可以自动创建的,这个应该没错啊!
ZOU_SEAFARER 2006-03-06
  • 打赏
  • 举报
回复
Private Sub Form_Load()
Text3.Text = App.Path & "\RollBookCalc.txt"
End Sub

'********************************************************

2、通过一个选择文件的文本框得到文件名和路径:
Private Sub cmdOpen_Click()
CommonDialog1.Filter = "文本文件(*.txt)|*.txt"
CommonDialog1.ShowSave
If CommonDialog1.filename <> "" Then
Text3.Text = CommonDialog1.filename
End If
End Sub

'********************************************************

3、获得文件名,并打开文件:
Private Sub SaveResaultToFile()
Dim Intext As String
Dim logFile As String
Dim temp_Filename As String
Dim filename As String
Dim i As Integer

Filename = Trim(Text3.Text)
If filename = "" Or IsNull(filename) Then
MsgBox "请选择要保存的文件名之后再保存!", vbInformation, "提示:"
Exit Sub
End If

'先读取文件内容
Open (filename) For Input As #1
Do While Not EOF(1)
Line Input #1, Intext
logFile = logFile + Intext + vbCrLf
Loop
Close #1
logFile = logFile & Text1.Text
Open (filename) For Output As #1
Print #1, logFile
Close #1
End Sub
去掉


temp_Filename = StrReverse(Trim(Text3.Text))
For i = 1 To Len(temp_Filename)
If Mid(temp_Filename, i, 1) = "\" Then
filename = StrReverse(Mid(temp_Filename, 1, i - 1))
Exit For
End If
Next
多余的,
AnnaBear 2006-03-06
  • 打赏
  • 举报
回复
你那所保存的盘里是不是根本没有那个文件?
我指的不是你文件包里的
湘王AI 2006-03-06
  • 打赏
  • 举报
回复
是:
Run-Time Err "55"
File already open
湘王AI 2006-03-06
  • 打赏
  • 举报
回复
1、初始时得到默认的文件名:
Private Sub Form_Load()
Text3.Text = App.Path & "\RollBookCalc.txt"
End Sub

'********************************************************

2、通过一个选择文件的文本框得到文件名和路径:
Private Sub cmdOpen_Click()
CommonDialog1.Filter = "文本文件(*.txt)|*.txt"
CommonDialog1.ShowSave
If CommonDialog1.filename <> "" Then
Text3.Text = CommonDialog1.filename
End If
End Sub

'********************************************************

3、获得文件名,并打开文件:
Private Sub SaveResaultToFile()
Dim Intext As String
Dim logFile As String
Dim temp_Filename As String
Dim filename As String
Dim i As Integer

temp_Filename = StrReverse(Trim(Text3.Text))
For i = 1 To Len(temp_Filename)
If Mid(temp_Filename, i, 1) = "\" Then
filename = StrReverse(Mid(temp_Filename, 1, i - 1))
Exit For
End If
Next
temp_Filename = Trim(Text3.Text)
If filename = "" Or IsNull(filename) Then
MsgBox "请选择要保存的文件名之后再保存!", vbInformation, "提示:"
Exit Sub
End If

'先读取文件内容
Open (filename) For Input As #1
Do While Not EOF(1)
Line Input #1, Intext
logFile = logFile + Intext + vbCrLf
Loop
Close #1
logFile = logFile & Text1.Text
Open (filename) For Output As #1
Print #1, logFile
Close #1
End Sub

'********************************************************

4、调用
Private Sub cmdSaveText_Click()
Call SaveResaultToFile
End Sub

然后就报错:
File already open !
ZOU_SEAFARER 2006-03-06
  • 打赏
  • 举报
回复
filename 当然要包括详细的路径了!
韧恒 2006-03-06
  • 打赏
  • 举报
回复
再多贴些代码,完整的,也许在其他方面有问题,比如,在上面某个过程还未执行结束时,又再次执行代码,造成冲突。
(此资源来自网络,本人不负任何责任) 易 游等等的虚拟还原功能都是用这开发的 一 安装和使用方法: 1 安装:看install.txt文件; 2 挂载:filedisk /mount 0 c:\proj\myfiledisk\a.img e: 3 卸载:filedisk /umount e: 详细看example.txt文件,在本站的下载中心有下载,包括核心层和应用层的源码。 最多可以同时挂4个设备,分别定义4个设备号,如果同一设备号使用2次,会进入OPEN_FILE两次,出现"FileDisk: IOCTL_FILE_DISK_OPEN_FILE: Media already opened\n"的错误提示; 二 基本知识: 1 关于DefineDosDevice函数: 在应用层开发中调用它来创建一个\??目录下的符号链接,如: BOOL okay = DefineDosDevice(DDD_RAW_TARGET_PATH, "test", "\\Device\\FileDisk0"); 调用成功后,将会在设备命名空间的\??目录下生成一个名为”test“的符号链接,该链接指向”“\\Device\\FileDisk0“这个对象。 而在核心态的驱动程序中,需要调用以下的函数来创建相应的符号链接: IoCreateSymbolicLink(linkname, targname); Linkname是要创建的符号链接名,相当于上面函数中的”test”,targname是该链接指向的设备对象。 2 filedisk的源映像可以是img,iso,flp等,这些都是磁盘上一个分区的平面映像,所以挂上后可以直接访问,但不能是整个硬盘的img映像或其它格式如rar等; 3 filedisk的源映像文件名称必须是全路径,即使是在当前目录下也必须是全路径; 4 源映像文件如果不存在且参数中没有指定只读,那么只要在参数中指定了大小则会主动创建它,使用前会提示先“格式化”,之后就可正常使用了; 三 核心层源码分析: 1 DriverEntry: 主函数入口;备份传入路径,查询注册表值,调用ZwCreateDirectoryObject创建设备目录,重复4次调用 FileDiskCreateDevice创建设备,初始化操作函数指针。 2 FileDiskCreateDevice:调用IoCreateDevice创建设备,KeInitializeEvent初始化事件对象,PsCreateSystemThread创建内核线程,入口函数是FileDiskThread,传入的函数参数为IoCreateDevice返回的设备对象。 3 FileDiskThread:首先调用KeSetPriorityThread更改自身线程的优先级为LOW_REALTIME_PRIORITY,然后开始for(;;),调用KeWaitForSingleObject函数等待事件对象有信号,如果等到,判断事件类型,有如下几种: IRP_MJ_READ:调用ZwReadFile读取文件,从内核到用户缓冲区; IRP_MJ_WRITE:调用ZwWriteFile写入文件,从用户到内核缓冲区; IRP_MJ_DEVICE_CONTROL:在FileDiskDeviceControl设置事件才会触发,主要有如下两种操作码: IOCTL_FILE_DISK_OPEN_FILE:调用FileDiskOpenFile。 IOCTL_FILE_DISK_CLOSE_FILE:调用FileDiskCloseFileFileDiskOpenFile:根据用户程序传入的映像文件全路径,调用ZwCreateFile在内核中打开它,如果文件不存在则再创建它,返回文件句柄。 FileDiskCloseFile:调用ZwClose关闭文件。 4 FileDiskCreateClose: 仅返回成功;对应Create,Close操作。 5 FileDiskReadWrite:将IO包插入队列,然后调用KeSetEvent函数,激活事件对象;对应Read,Write操作。 6 FileDiskDeviceControl:用户程序调用DeviceIoControl的响应函数,主要有如下两种操作: IOCTL_FILE_DISK_OPEN_FILE:设置好参数,将IO包插入队列,设置对象为有信号。 IOCTL_FILE_DISK_CLOSE_FILE:将IO包插入队列,设置对象为有信号。 其它的操作类型因为输入输出共用一个缓冲区,所以都采用系统默认处理,设置好需要输出的参数后,就直接从这个函数返回了。如: IOCTL_DISK_GET_DRIVE_GEOMETRY,IOCTL_CDROM_GET_DRIVE_GEOMETRY等; 7 有4种操作是自定义的:FileDiskReadWrite函数两种,FileDiskDeviceControl函数两种,对应的操作码分别是: IRP_MJ_READ,IRP_MJ_WRITE,IOCTL_FILE_DISK_OPEN_FILE,IOCTL_FILE_DISK_CLOSE_FILE这4种,在FileDiskThread中等待这4种事件发生,如果等到,就调用相应的函数处理。 四 应用层源码分析: 1 mount:调用DefineDosDevice在应用层创建一个指向设备命名空间的符号链接,用CreateFile打开此链接,然后调用DeviceIoControl,控制码是IOCTL_FILE_DISK_OPEN_FILE,内核程序响应后,执行真正打开源映像文件的操作。 2 umount: 上面大致一样,只是多一些步骤,不同的是控制码改为IOCTL_FILE_DISK_CLOSE_FILE,之后必须发送FSCTL_DISMOUNT_VOLUME

7,789

社区成员

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

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