Delphi读取文本文件I/O error 32错误

juipter 2007-08-02 03:43:03
请教,我是Delphi实时读取文本文件的数据,程序初运行是正常的,但是运行一段时间后,就会报“I/O error 32“错误,程序就卡死了,我无法查出原因,特来请教。
文件是别人6分钟一次定时送进我的目录的,我的程序就是定时读取这个目录中的文件,取里面的值。
主要代码如下:
Assignfile(myfile,pth+'\'+LStrls2.strings[LStrls2.Count-1]);
Reset(myfile);

while not eof (myfile) do
begin
readln(myfile,ttxt);
mytxt:=mytxt+' '+ttxt;
end;
closefile(myfile);

我实在查不出原因,请大家指教
...全文
4214 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
himonny 2009-03-04
  • 打赏
  • 举报
回复
文本文件式非獨占式的
所以無所謂的
zzzzzllllll 2007-08-03
  • 打赏
  • 举报
回复
给你一段 判断文件是否在使用中的代码读取前先判断下
function IsFileInUse(fName: string):boolean;
var
HFileRes : HFILE;
begin
Result := false;
try
if not FileExists(fName) then
begin
Result:=False;
Exit;
end;
except
Result:=True;
Exit;
end;
HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not Result then
CloseHandle(HFileRes);
end;
huojiangui 2007-08-03
  • 打赏
  • 举报
回复
解决的方法是在执行
Assignfile(myfile,pth+ "\ "+LStrls2.strings[LStrls2.Count-1]);
Reset(myfile);
这两句前,判断一下进程里面是否有该文件或者该文件所需要的进程,如果有就杀掉该进程!
记事本进程是 kissTASK(NOTEPAD.EXE); 如果是 WORD需要杀掉kissTask(winword.exe);呵呵,希望对你有帮助 !
function KillTask(ExeFileName: string): Integer;
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
Result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while Integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(
OpenProcess(PROCESS_TERMINATE,BOOL(0),FProcessEntry32.th32ProcessID),0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
huojiangui 2007-08-03
  • 打赏
  • 举报
回复
同意unsigned 的观点,这个问题我也遇到过,执行RESET的时候会错误
qjinshanq 2007-08-03
  • 打赏
  • 举报
回复
设置变量控制对该文件的操作
brightyang 2007-08-03
  • 打赏
  • 举报
回复
文件是别人6分钟一次定时送进我的目录的....

是否这个别人正在操作?
僵哥 2007-08-03
  • 打赏
  • 举报
回复
32:另一个程序正在使用此文件,进程无法访问。
hongqi162 2007-08-03
  • 打赏
  • 举报
回复
建议共享读写文件模式
gutiqiang 2007-08-02
  • 打赏
  • 举报
回复
同意LS
hutgu1 2007-08-02
  • 打赏
  • 举报
回复
可能不能同时操作文件,当别人正在送进你目录的时候,你正好读文件或者写文件;或者相反
juipter 2007-08-02
  • 打赏
  • 举报
回复
文件名没有取错,初运行也正常,运行一段时间后才会出错的.
brightyang 2007-08-02
  • 打赏
  • 举报
回复
应该不会出问题。。。。

看看你的文件名是否取错了。。。。
网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。   Bootcfg   bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。   含有下列参数的 bootcfg 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 bootcfg 命令。   用法:   bootcfg /default  设置默认引导项。   bootcfg /add    向引导列表中添加 Windows 安装。   bootcfg /rebuild  重复全部 Windows 安装过程并允许用户选择要添加的内容。   注意:使用 bootcfg /rebuild 之前,应先通过 bootcfg /copy 命令备份 boot.ini 文件。   bootcfg /scan    扫描用于 Windows 安装的所有磁盘并显示结果。   注意:这些结果被静态存储,并用于本次会话。如果在本次会话期间磁盘配置发生变化,为获得更新的扫描,必须先重新启动计算机,然后再次扫描磁盘。   bootcfg /list   列出引导列表中已有的条目。   bootcfg /disableredirect 在启动引导程序中禁用重定向。   bootcfg /redirect [ PortBaudRrate] |[ useBiosSettings]   在启动引导程序中通过指定配置启用重定向。   范例: bootcfg /redirect com1 115200 bootcfg /redirect useBiosSettings   hkdsk   创建并显示磁盘的状态报告。Chkdsk 命令还可列出并纠正磁盘上的错误。   含有下列参数的 chkdsk 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 chkdsk 命令。   vol [drive:] [ chkdsk [drive:] [/p] [/r]   参数  无   如果不带任何参数,chkdsk 将显示当前驱动器中的磁盘状态。 drive: 指定要 chkdsk 检查的驱动器。 /p   即使驱动器不在 chkdsk 的检查范围内,也执行彻底检查。该参数不对驱动器做任何更改。 /r   找到坏扇区并恢复可读取的信息。隐含着 /p 参数。   注意 Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该命令。 Diskpart   创建和删除硬盘驱动器上的分区。diskpart 命令仅在使用故障恢复控制台时才可用。   diskpart [ /add |/delete] [device_name |drive_name |partition_name] [size]   参数 无   如果不带任何参数,diskpart 命令将启动 diskpart 的 Windows 字符模式版本。   /add   创建新的分区。   /delete   删除现有分区。   device_name   要创建或删除分区的设备。设备名称可从 map 命令的输出获得。例如,设备名称:   DeviceHardDisk0   drive_name   以驱动器号表示的待删除分区。仅与 /delete 同时使用。以下是驱动器名称的范例:   D:   partition_name   以分区名称表示的待删除分区。可代替 drive_name 使用。仅与 /delete 同时使用。以下是分区名称的范例:   DeviceHardDisk0Partition1    大小   要创建的分区大小,以兆字节 (MB)表示。仅与 /add 同时使用。   范例   下例将删除分区: diskpart /delete Device HardDisk0 Partition3 diskpart /delete F:   下例将在硬盘上添加一个 20 MB 的分区:   diskpart /add Device HardDisk0 20   Fixboot
winxp系统结构5课(注册表)->1认识注册表
作者:netcicala 来源:www.netcicala.com 发布时间:2007-7-4 19:56:01
减小字体 增大字体

一.计算机原理2课(硬件)->
二.计算机脚本技术25课(DOS命令/批处理/VBS脚本)->
三.winxp系统结构5课(注册表)->
四.计算机病毒原理5课(VBS/VC语言实现)->
五.网络安全及其网络软件应用10课->
六.VB6.0程序设计入门10课->
七.C语言程序设计入门10课->
时间:每周一,二,四8:00~9:00。
UC房间:黑客家族网络安全
本人UC号:38378943 83034769


winxp系统结构5课(注册表)->1认识注册表
时间:6月28日晚20点30-22点
地点:UC聊天室-> 黑客家族网络安全
讲义地址:http://www.netcicala.com/article/sort015/info-251.html
大概内容:FSO 对象
主讲:网蝉。

WINXP的系统结构:
==============================================================
windows启动过程:
1,windows的启动过程:
一,winxp首先加载NTLDR文件。 此文件位于:C:根目录下。
二,初始化:NTLDR加载后会将处理器从实模式转化为32位保护模式。
三,读取boot.ini文件,c:\下的boot.ini和bootsect.dos配合来完成多操作系统的管理。
四,加载NtDetect.com文件:此文件的作用是检测计算机硬件,如并口,显示适配器等设备,
并将收集到的信息的硬件列表返回NTLDR用于以后的注册表中注册保存。
五,选择硬件配置文件,一般WINxp会按照默认形式加载,如要修改,可直接到设备管理器中进行修改。
六,装在内核:NtOsKrNl.exe 此文件位于windows\system32目录下。
七,HAL加载:HAL=硬件抽象层,系统会采用HAL来隐藏特定平台的硬件接口细节。
为操作系统提供虚拟硬件平台,使其具有硬件无关性。
八,内核初始化,NTLDR将控制权交给NtOsKrNl.exe,
九,开始装并初始化设备驱动程序,启动win32子系统和winxp的各项服务系统。
十,win32子系统启动winlogon.exe,并启动LSASS.EXE显示登陆对话框,同时windows也会配置网络设备/用户环境,
个性化设置等信息。

=====================================================
windows注册表
注册表的用途:
用来记录windows系统配置信息和软件配置情况的数据库。

什么是系统配置情况? 例如你把显示器分辨率变成800*600的了,下次启动的时候将会是800*600。
又如windows开机会自动运行哪些程序。
什么叫软件配置情况?例如我们设置uctools里面的自动留言功能,则在uctools.ini里面就有你设置自动回复的文字项在里面。
为什么很多安装软件都要去改写注册表?1,在系统中注册。2,在注册表中保存软件配置信息。
为什么某些软件你对他的使用情况配置了一下, 下次启动之后这个软件的配置就会保留?
1,注册表中做记录。
2,程序自身或程序的数据库文件内记录。
例子1:在数据文件中配置我们的软件。
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists("password.txt") Then
set objTextFile = fso.OpenTextFile("password.txt",1)
k= objTextFile.Readline
l= objTextFile.Readline
objTextFile.Close
End If
Set f = fso.CreateTextFile("password.txt", True)
i=InputBox("输入用户名","用户信息确认",k)
j=InputBox("输入密码","用户信息确认",l)
f.WriteLine(i)
f.WriteLine(j)
f.Close
Set fso=Nothing
上面脚本执行第一次的时候,我们输入一个信息到程序中。
当地二次运行后,你会发现他所显示的是我们上一次打开这个程序的时候输入的内容。
注册表是用来记录WINDOWS系统配置信息的。 道理同我们上例中的password.txt文件一样,是一个数据库文件。

例子2:在注册表中配置我们的软件。
on error resume next
Set WshShell = WScript.CreateObject("WScript.Shell")
readreg = WshShell.RegRead("HKCU\Software\aaa\")
If readreg="" Then
MsgBox("软件没有配置过")
Else
MsgBox("配置信息为:"&readreg)
End If
aa=InputBox("输入/更改我们的软件配置信息")
WshShell.RegWrite"HKCU\Software\aaa\",aa, "REG_SZ"
set WshShell=Nothing


为什么双击exe文件会直接运行,而双击txt文本打开的却是记事本?

=====================================================
名称---〉数据类型--〉描述
二进制值
REG_BINARY
原始二进制数据。大多数硬件组件信息作为二进制数据存储,以十六进制的格式显示在注册表编辑器中。
=====================================================
DWORD 值
REG_DWORD
由 4 字节长(32 位整数)的数字表示的数据。设备驱动程序和服务的许多参数都是此类型,以二进制、十六进制或十进制格式显示在注册表编辑器中。与之有关的值是 DWORD_LITTLE_ENDIAN(最不重要的字节在最低位地址)和 REG_DWORD_BIG_ENDIAN(最不重要的字节在最高位地址)。
=====================================================
可扩展字符串值
REG_EXPAND_SZ
长度可变的数据字符串。这种数据类型包括程序或服务使用该数据时解析的变量。
=====================================================
多字符串值
REG_MULTI_SZ
多字符串。包含用户可以阅读的列表或多个值的值通常就是这种类型。各条目之间用空格、逗号或其他标记分隔。
=====================================================
字符串值
REG_SZ
长度固定的文本字符串。
=====================================================
二进制值
REG_RESOURCE_LIST
一系列嵌套的数组,用于存储硬件设备驱动程序或它控制的某个物理设备所使用的资源列表。此数据由系统检测并写入 \ResourceMap 树,作为二进制值以十六进制的格式显示在注册表编辑器中。
=====================================================
二进制值
REG_RESOURCE_REQUIREMENTS_LIST
一系列嵌套的数组,用于存储一个设备驱动程序(或其控制的某个物理设备)可以使用的硬件资源列表。系统将此列表的子集写入 \ResourceMap 树。此数据由系统检测,作为二进制值以十六进制的格式显示在注册表编辑器中。
=====================================================
二进制值
REG_FULL_RESOURCE_DESCRIPTOR
一系列嵌套的数组,用于存储物理硬件设备使用的资源列表。此数据由系统检测并写入 \HardwareDescription 树,作为二进制值以十六进制的格式显示在注册表编辑器中。
=====================================================

REG_NONE
没有具体类型的数据。此数据由系统或应用程序写到注册表,作为二进制值以十六进制的格式显示在注册表编辑器中。
=====================================================
链接
REG_LINK
一个 Unicode 字符串,它命名一个符号链接。
=====================================================
QWORD 值
REG_QWORD
由 64 位整数数字表示的数据。此数据作为二进制值显示在注册表编辑器中,最初用在 Windows 2000 中。
=====================================================

注册表配置单元是注册表中的一组项、子项和值,它有一组支持文件,这些文件包含其数据的备份。
在 Windows NT 4.0、Windows 2000、Windows XP 和 Windows Server 2003 中,除 HKEY_CURRENT_USER 之外,所有其他配置单元的支持文件都位于 Systemroot\System32\Config 文件夹中;
HKEY_CURRENT_USER 的支持文件位于C:\Documents and Settings\用户名\NTUSER.DAT文件夹中。
注册表配置单元 支持文件
HKEY_LOCAL_MACHINE\SAM Sam、Sam.log、Sam.sav
HKEY_LOCAL_MACHINE\Security Security、Security.log、Security.sav
HKEY_LOCAL_MACHINE\Software Software、Software.log、Software.sav
HKEY_LOCAL_MACHINE\System System、System.alt、System.log、System.sav
HKEY_CURRENT_CONFIG System、System.alt、System.log、System.sav、Ntuser.dat、Ntuser.dat.log
HKEY_USERS\DEFAULT Default、Default.log、Default.sav

注册表的修改方法:
1,REGEDIT
2,INF文件
3,REG命令
4,VBS
5,编程改写(如VB/VC/DELPHI等)
6,程序改写,如WINDOWS优化大师等软件。

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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