disk i/o error_delphi项目运行时提示I/O error 6是什么原因?

原问题:delphi项目运行时提示I/O error 6是什么原因?
分类:编程开发 > 最后更新时间:【2016-12-22 22:49:12】
问题补充:

程序编译的过去,但运行时提示 I/O error 6是什么原因?已经锁定异常范围,但,该部分的SQL语句能够正常运行,能够读出各种数据。

紫色框的是异常范围,在日志SendToExeLog('xxxxxxxxH10。1xxxxxxxxxxxxx');之后,就完全没有进行,直接跳出,进入下一方法。

红色框的selectpp是涉及到的SQL语句,但在数据库中查询的时候,语句都能查的到。

这个是selectpp的语句

最佳答案

看你的程序,可能的问题是出在SendToExeLog上

因为你有异常处理,在 SendToExeLog中出错,自然后面的都不会执行

检查你的SendToExeLog函数(上面没有看到它的实现),可能的问题是你的日志文件没有正常打开或被其它程序占用了.


追问:
之前那段话是没有异常处理的,因为运行的时候提示I/O error 6 所以后面又加了异常处理。您说的那个 :问题可能出在SendToExeLog上,我不太懂,该怎么看?是看异常处理那块的SendToExeLog吗?可是这个在没加异常处理前,只有H10,H11,之后的三个SendToExeLog都是我后来加的,加之前就提示这个错误了。您在指导下,谢谢啦~ 追答:
SendToExeLog应该是个自定义的函数(delphi本身是没有这个函数的)你要看下这个函数的具体定义及运行过程(最好把这个函数的实现贴出来看下)按理你加的这些不会影响程序的执行,但从你的错误来问题看应该是出在这个函数上
追问:
procedure SendToExeLog(msgLog: string);var strList: TStringList; LogName: string; iDelCount: Integer;begin strList := TStringList.Create; LogName := Application.ExeName +".log"; try if not FileExists(LogName) then begin FileClose(FileCreate(LogName)); end; strList.LoadFromFile(LogName); iDelCount := strList.Count - 600; //todo 日志行数配置 while iDelCount > 0 do begin strList.Delete(0); Dec(iDelCount); end; strList.Add(DatetimeToStr(Now) + ":" + msgLog); strList.SaveToFile(logName); finally strList.Free; end; //顺便保存到日志目录里 SaveDateLog(msglog);end;是调用的其他单元文件的SendToExeLog函数,用这个函数是有什么规则吗?麻烦在帮忙看下吧,没看出来什么T_T麻烦了,再看下,谢谢啦 追答:
你的这段程序,除了SaveDateLog(msglog);外,其它的我测试下没有发现问题1.你可以把SaveDateLog(msglog);发上来看下2.I/O错一般是因为读写文件错,也可能不是程序问题,如你的日志文件被其它程序独享打开或硬盘有硬件上的问题,当然,后者的可能性较小,你可以用编辑器打开日志文件看下,它写到那一条了3.用调试,看下程序执行到那一条语句报错,再检查该语句的上下文
追问:
procedure SaveDateLog(str: string;messageType : TMyMessage=mtINFO);var sDIR : String ; sDate : String ; sLevel : String ; sFileName, sFileName_del: String; Log : TextFile; FileHandle: Integer; Year, Month, Day: Word;begin sDIR := "MessageLog" ; if not DirectoryExists(sDIR) then begin CreateDir(sDIR); end; DecodeDate(Date - posData.iSaveLogDays, Year, Month, Day); sDate := Format("%4d-%2d-%2d", [Year, Month, Day]); sFileName_del := sDIR+"\" + "LOG" + sDate + ".TXT"; if FileExists(sFileName_del) then SysUtils.DeleteFile(sFileName_del); DecodeDate(Date, Year, Month, Day); sDate := Format("%4d-%2d-%2d", [Year, Month, Day]); sFileName := sDIR+"\" + "LOG" + sDate + ".TXT"; if not FileExists(sFileName) then begin FileHandle := FileCreate(sFileName); FileClose(FileHandle); end; if messageType = mtINFO then sLevel := "INFO " else if messageType = mtWARNING then sLevel := "WARNING" else if messageType = mtError then sLevel := "ERROR " ; AssignFile(Log, sFileName); try Append(Log); WriteLn(Log, DatetimeToStr(Now) + ":"+sLevel+":"+str); Flush(Log); finally CloseFile(Log); end;end;恩恩,他就执行到while not eof do 这里停止了,后面就没有执行,然后就跳出了这个方法。查看日志,它显示的它读取的数据文件是空的,但又通过数据库查询,是查的到数据的,所以SQL 语句应该是没有问题的。我现在就有点蒙圈了,您在帮忙看下SaveDateLog这个函数,麻烦了,麻烦了 追答:
我测试了下程序,问题应该出在SaveDateLog中,我的测试结果是不稳定的你可试下,将程序 //顺便保存到日志目录里 SaveDateLog(msglog);中的 SaveDateLog(msglog);注释掉试下它是用AssignFile访问文件的,可能会有错(不同delphi版权的这个函数稳定性有区别的)如果注释后程序能正常运行,最好修改这段程序,用TStringList的SaveToFile写文件(像SendToExeLog中一样)另一个解决方案可试下1.在if messageType = mtINFO then前面加个小延时,如Sleep(50);2. 在AssignFile(Log, sFileName); try下面加个 Reset(log);

  • 追问:
    恩恩,好的好的,谢谢,灰常谢谢
    最佳答案由网友  whoami1978  提供
  • 公告: 为响应国家净网行动,部分内容已经删除,感谢网友理解。
    12

    分享到:

    其他回答

    暂无其它回答!

      推荐