主题:-- 有时删除一个文件,会出现存取错误,如何避免? ---
琅拿度
[专家分:2820] 发布于 2010-01-29 09:55:00
原因是因为这个文件正被某个程序读取,如何可以判断目标文件可以被删除?从而避免错误出现
回复列表 (共17个回复)
11 楼
0901chang [专家分:10660] 发布于 2010-01-30 13:55:00
[quote]还是用乌鸦兄的方法吧:
x=-1
Do While x=-1 AND FILE('abc.doc') && 删不了就不活了
x=Fopen('abc.doc',12)
=FCLOSE(x)
Enddo
if x!=-1
dele file abc.doc
on error retry && 很多余啊,呵呵
endi
[/quote]
楼猪,不能这么干,这是一个死循环
x=Fopen('abc.doc',12)
=FCLOSE(x)
if x=-1
想办法关闭 abc.doc之后,再确认是否已经关闭
x=Fopen('abc.doc',12)
=FCLOSE(x)
endi
if .not.x=-1
dele file 'abc.doc
else
删不了就不活了,你只能提示用户:abc.doc已经打开,请你手工关闭该文件
否则不能运行后面的程序,若用户无法手工关闭,叫用户关机,重新开机
endi
其实,这就是事物处理的编程方法,有人说SQL数据库才能进行事物处理,其实你就可以对你自己的进程进行事物处理。
12 楼
琅拿度 [专家分:2820] 发布于 2010-01-30 19:59:00
乌鸦,我知道我编的是死循环(别的程序打开该文件时),有的问题不到你不相信,它就是那么奇怪。
问题:
我确认abc.doc是不被其它程序占用的,所以我这段代码理应顺利进行下去才对,但实际却不是,会假死或死循环。我加了一句wait之后,才正常,为什么?
x=-1
Do While x=-1 AND FILE('abc.doc') && 删不了就不活了,开个玩笑而已,只是给我用的,我知道要去关掉它
x=Fopen('abc.doc',12)
=FCLOSE(x)
wait 'waiting...' window at -1,-1 timeout 0.1 && 加了这句话,貌似还没有发生问题,为什么?
Enddo
if x!=-1
dele file abc.doc
on error retry && 很多余啊,呵呵,这句话可以删掉
endi
13 楼
琅拿度 [专家分:2820] 发布于 2010-01-30 20:02:00
5楼的情况,我也想不到是什么问题?
14 楼
0901chang [专家分:10660] 发布于 2010-01-31 12:57:00
x=-1
Do While x=-1 AND FILE('abc.doc') && 删不了就不活了
x=Fopen('abc.doc',12)
=FCLOSE(x)
Enddo
这是一个错误的逻辑,你很难找到一个正确的东东去完善的解释它,最好是不要再浪费时间去完善它。
x=Fopen(y,z)
x是本次打开文件的句柄,不是你在此之前打开y文件的句柄,所以
=FCLOSE(x)无法关闭之前打开的y文件,楼主认真的看一看fopen函数的说明。
你的程序在前面打开的abc.doc文件,若想用FCLOSE()关闭,你必须有其打开时的句柄,若没有,可以用API去做.
15 楼
琅拿度 [专家分:2820] 发布于 2010-01-31 22:45:00
乌鸦,我有必要解释一下,其实abc.doc是我另外一个程序(A程序)在操作的对象,它随时可能被A程序关闭。
下面的代码是B程序的:
x=-1
Do While x=-1 AND FILE('abc.doc') && 如果X=-1并且文件存在执行该循环(表面上看是个死循环,但,随着A程序关闭它,该循环就可以结束了)
x=Fopen('abc.doc',12) && 得到句柄
=FCLOSE(x) && 关闭
wait 'waiting...' window at -1,-1 timeout 0.1 && 如果没有这句话,A就算关闭了文件,这里还是死循环,这里怎么解释呢?
Enddo
一直的循环过程就是要随时检测ABC.DOC是否可以被删除。不过一定要加wait这一行,否则很可能死循环。
16 楼
0901chang [专家分:10660] 发布于 2010-02-01 01:02:00
[quote]乌鸦,我有必要解释一下,其实abc.doc是我另外一个程序(A程序)在操作的对象,它随时可能被A程序关闭。
下面的代码是B程序的:
x=-1
Do While x=-1 AND FILE('abc.doc') && 如果X=-1并且文件存在执行该循环(表面上看是个死循环,但,随着A程序关闭它,该循环就可以结束了)
x=Fopen('abc.doc',12) && 得到句柄
=FCLOSE(x) && 关闭
wait 'waiting...' window at -1,-1 timeout 0.1 && 如果没有这句话,A就算关闭了文件,这里还是死循环,这里怎么解释呢?
Enddo
一直的循环过程就是要随时检测ABC.DOC是否可以被删除。不过一定要加wait这一行,否则很可能死循环。
[/quote]
若此说来,你的程序是对的,加wait语句,给另外的进程腾出运行的空间(时间),可能可以如此解释吧?
17 楼
琅拿度 [专家分:2820] 发布于 2010-02-01 22:21:00
不加wait,程序很大的机率死循环
加了wait,目前没有问题而已,不过这样的程序我不敢随便用啊,自己都解释不了
我来回复