主题:救命啊!真是没办法了!
hw2007name
[专家分:4790] 发布于 2008-09-18 10:18:00
我的一个自定义函数如下,不知道那里出现了漏洞,以前用着好好的,今天不管怎么测试都有问题:
我的主程序比如在:"D:\ML\安装程序制作工具.EXE"
FUNCTION FileUsed&&判断文件是否在使用,并返回逻辑型数据
PARAMETERS cPrFileName&&比如传递来一个文件全名:"F:\程序\统计表.ICO"
PRIVATE nUseOpenError,nOpenFile,cNowOnError
nUseOpenError=1
nOpenFile=-1
IF TYPE("cPrFileName")#"C"
RETURN .F.
ENDIF
IF !FILE(cPrFileName,1)
RETURN .F.
ENDIF
cNowOnError=ON("ERROR")
ON ERROR nUseOpenError=0
MESSAGEBOX(cPrFileName,64,"Open")&&在这里文件都是"F:\程序\统计表.ICO"
nOpenFile=FOPEN("&cPrFileName.",2)&&在这里偶尔出现打不开文件,实际上我根本没有使用此文件
ON ERROR &cNowOnError.
IF nOpenFile<=-1
MESSAGEBOX(cPrFileName,64,"error")&&偶尔打不开时,文件名一样的是"F:\程序\统计表.ICO"
[color=FF0000]COPY FILE (cPrFileName) TO "f:\m"+SYS(2015)+"."+JUSTEXT(cPrFileName)[/color]
&©时,在里文件名变了,cPrFileName不是"F:\程序\统计表.ICO",而成了"D:\ML\统计表.ICO".
RETURN .T.
ELSE
=FCLOSE(nOpenFile)
RETURN .F.
ENDIF
各位高手些帮帮忙啊,我实在没办法,找出程序漏洞在那里,主要原因是文件名不知道为什么会变,还有就是FOPEN文件是不是有什么要求,我查看VFP帮助中没提到什么,但我的这个函数,以前我的多个程序都使用得正,不知道怎么现在出现问题,上面的MESSAGEBOX,COPY FILE命令行我是为了测试出错原因而加的.
最后更新于:2008-09-18 11:03:00
回复列表 (共9个回复)
沙发
hw2007name [专家分:4790] 发布于 2008-09-18 10:23:00
我想正因为文件名变了,所以FOPEN没法打开.
板凳
hw2007name [专家分:4790] 发布于 2008-09-18 11:02:00
我现在发现了一点线索:如果被判断的文件名(只是一个文件名和扩展名)在我的主程序(安装程序制作工具.EXE)也存在在有相同名字的,我的程序就会把其路径变为主程序的相对路径,如:
我用FileUsed判断一个文件"F:\程序\统计表.ICO"是否正在使用,如果"安装程序制作工具.EXE"中在编译时也包含一个文件名为"统计表.ICO"的文件,则上面的这个文件将会改为"安装程序制作工具.EXE"中所在路径一下的一个路径中,"D:\安装程序制作工具\ICO\统计表.ICO".郁闷!!!!
3 楼
moz [专家分:37620] 发布于 2008-09-18 16:00:00
cPrFileName=fullpath(cPrFileName)
4 楼
hw2007name [专家分:4790] 发布于 2008-09-18 16:42:00
[quote]cPrFileName=fullpath(cPrFileName)[/quote]
谢谢,暂时解决问题!但还是不明白为什么,我的程序在传递文件时,一直是用的绝对路径,为什么还有用FULLPATH()取得完整路径啊!
5 楼
cbl518 [专家分:57140] 发布于 2008-09-18 22:11:00
FUNCTION FILEUSED_TORF(cPrFileName as String) &&判断文件是否在使用,并返回逻辑型数据
IF VarTYPE(cPrFileName)#"C" OR ! FILE(cPrFileName,1)
RETURN .F.
ENDIF
LOCAL cNowOnError,lUseOpenError
cNowOnError=ON("ERROR")
ON ERROR lUseOpenError=.T.
RENAME (cPrFileName) TO (cPrFileName)
ON ERROR &cNowOnError.
RETURN lUseOpenError
6 楼
hw2007name [专家分:4790] 发布于 2008-09-18 23:42:00
cbl518老师,你看过我的程序没,我不知道为什么会这样,用你改的函数同样存在上面的问题!还是加:cPrFileName=fullpath(cPrFileName) 才能解决问题,我真的找不出原因了,麻烦老师再帮我看一上我程序是那里出现了漏洞,从而造的以上问题,在此先向你表示感谢,感谢你对狐友们无私地帮助.
7 楼
moz [专家分:37620] 发布于 2008-09-19 01:04:00
[quote]Visual FoxPro 9.0 语言参考
FOPEN( ) 函数
打开一个供低级文件函数使用的文件。
FOPEN(cFileName [, nAttribute])
参数 cFileName
指定要打开的文件的名称。cFileName 可包含 Visual FoxPro 搜索路径中未指定的 打开文件所在的目录、文件夹、驱动器或卷标。如果不含路径,Visual FoxPro 将在以下位置搜索文件:
[color=ff00ff]默认目录
SET PATH 命令建立的路径[/color][/quote]
但我费解的是,
你为什么要使用宏替换?
在Copy后再加一句Messagebox( )
注意区别每一句Messagebox( )的标题
分清楚是哪一句发生的事情.
其实使用调试器很方便,
在函数首行设置断点,
按<F8>单步运行,
检查每一行代码对 cPrFileName 变量值的变化作用
8 楼
cbl518 [专家分:57140] 发布于 2008-09-19 13:38:00
[quote]cbl518老师,你看过我的程序没,我不知道为什么会这样,用你改的函数同样存在上面的问题!还是加:cPrFileName=fullpath(cPrFileName) 才能解决问题,我真的找不出原因了,麻烦老师再帮我看一上我程序是那里出现了漏洞,从而造的以上问题,在此先向你表示感谢,感谢你对狐友们无私地帮助.[/quote]
1 如果文件正在使用是不能复制的!
2 用低级函数把文件,装载到内存的方法,判断文件是否在使用,一方面效率慢,另方面还不可靠。
3 exe 文件,读取路径时,不管你是否指定路径,都首先读取 exe 内部的同名文件。除非你用,vfp 的函数,声明是,绝对路径或相对路径sys(2014)、fullpath()!
9 楼
hw2007name [专家分:4790] 发布于 2008-09-19 14:13:00
[quote]
3 exe 文件,读取路径时,不管你是否指定路径,都首先读取 exe 内部的同名文件。除非你用,vfp 的函数,声明是,绝对路径或相对路径sys(2014)、fullpath()![/quote]
可以就是这个原因,我在程序一直是用的绝对路径,只是没用FULLPATH()!
我来回复