回 帖 发 新 帖 刷新版面

主题:救命啊!真是没办法了!

我的一个自定义函数如下,不知道那里出现了漏洞,以前用着好好的,今天不管怎么测试都有问题:
我的主程序比如在:"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]
    &&COPY时,在里文件名变了,cPrFileName不是"F:\程序\统计表.ICO",而成了"D:\ML\统计表.ICO".
    RETURN .T.
ELSE    
    =FCLOSE(nOpenFile)    
    RETURN .F.
ENDIF
各位高手些帮帮忙啊,我实在没办法,找出程序漏洞在那里,主要原因是文件名不知道为什么会变,还有就是FOPEN文件是不是有什么要求,我查看VFP帮助中没提到什么,但我的这个函数,以前我的多个程序都使用得正,不知道怎么现在出现问题,上面的MESSAGEBOX,COPY FILE命令行我是为了测试出错原因而加的.

回复列表 (共9个回复)

沙发

我想正因为文件名变了,所以FOPEN没法打开.

板凳

我现在发现了一点线索:如果被判断的文件名(只是一个文件名和扩展名)在我的主程序(安装程序制作工具.EXE)也存在在有相同名字的,我的程序就会把其路径变为主程序的相对路径,如:
我用FileUsed判断一个文件"F:\程序\统计表.ICO"是否正在使用,如果"安装程序制作工具.EXE"中在编译时也包含一个文件名为"统计表.ICO"的文件,则上面的这个文件将会改为"安装程序制作工具.EXE"中所在路径一下的一个路径中,"D:\安装程序制作工具\ICO\统计表.ICO".郁闷!!!!

3 楼

cPrFileName=fullpath(cPrFileName)

4 楼

[quote]cPrFileName=fullpath(cPrFileName)[/quote]
谢谢,暂时解决问题!但还是不明白为什么,我的程序在传递文件时,一直是用的绝对路径,为什么还有用FULLPATH()取得完整路径啊!

5 楼

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 楼

cbl518老师,你看过我的程序没,我不知道为什么会这样,用你改的函数同样存在上面的问题!还是加:cPrFileName=fullpath(cPrFileName) 才能解决问题,我真的找不出原因了,麻烦老师再帮我看一上我程序是那里出现了漏洞,从而造的以上问题,在此先向你表示感谢,感谢你对狐友们无私地帮助.

7 楼

[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 楼

[quote]cbl518老师,你看过我的程序没,我不知道为什么会这样,用你改的函数同样存在上面的问题!还是加:cPrFileName=fullpath(cPrFileName) 才能解决问题,我真的找不出原因了,麻烦老师再帮我看一上我程序是那里出现了漏洞,从而造的以上问题,在此先向你表示感谢,感谢你对狐友们无私地帮助.[/quote]

1 如果文件正在使用是不能复制的!

2 用低级函数把文件,装载到内存的方法,判断文件是否在使用,一方面效率慢,另方面还不可靠。

3 exe 文件,读取路径时,不管你是否指定路径,都首先读取 exe 内部的同名文件。除非你用,vfp 的函数,声明是,绝对路径或相对路径sys(2014)、fullpath()!

9 楼

[quote]
3 exe 文件,读取路径时,不管你是否指定路径,都首先读取 exe 内部的同名文件。除非你用,vfp 的函数,声明是,绝对路径或相对路径sys(2014)、fullpath()![/quote]

可以就是这个原因,我在程序一直是用的绝对路径,只是没用FULLPATH()!

我来回复

您尚未登录,请登录后再回复。点此登录或注册