回 帖 发 新 帖 刷新版面

主题:-- 有时删除一个文件,会出现存取错误,如何避免? ---

原因是因为这个文件正被某个程序读取,如何可以判断目标文件可以被删除?从而避免错误出现

回复列表 (共17个回复)

11 楼

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

乌鸦,我知道我编的是死循环(别的程序打开该文件时),有的问题不到你不相信,它就是那么奇怪。

问题:
我确认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 楼

5楼的情况,我也想不到是什么问题?

14 楼

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 楼

乌鸦,我有必要解释一下,其实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 楼

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

不加wait,程序很大的机率死循环

加了wait,目前没有问题而已,不过这样的程序我不敢随便用啊,自己都解释不了

我来回复

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