(defun DwgFileStatus (DwgName / *dwg* *folder* *name* *dwl* *ret* *f*)
(if (setq *dwg* (findfile DwgName))
(progn
(setq *folder* (vl-filename-directory *dwg*))
(setq *name* (vl-filename-base *dwg*))
(setq *dwl* (findfile (strcat *folder* "\\" *name* ".dwl")))
)
)
(setq *ret*
(cond
((not *dwg*)
'NoSuchFile
)
((setq *f* (open *dwg* "a"))
'Editable
)
((not *dwl*)
'ReadOnly
)
((setq *f* (open *dwl* "a"))
'EditableAfterCrash
)
((not *f*)
'InUse
)
(T
'NotProspected
)
)
)
(if *f* (close *f*))
*ret*
) 它将受到文件状态的影响,因为我打开它是为了进行写访问(请注意“a”-append选项)。因此,如果有人已经打开了它(即使是你自己),windows将不允许此调用,并且open函数将返回nil。
我也不太乐意打开它——但这就是你在AutoLisp中真正能做的一切。即使使用ActiveX脚本,文件系统/文件对象也无法检查文件是否由其他人打开。这绝对不是理想的,因为你依赖的是失败/不成功。虽然打开它然后直接关闭应该没有任何问题-注意,我还使用了“a”(append)选项,以防“w”(rewrite)选项删除文件的内容。
为此,我建议Ahankhaha将close call放在尽可能靠近open的位置——实际上,我会将其直接放在每个cond条件中的open之后。即使在函数中需要两个重复项,但这样更安全(你永远不知道以后是否要扩展函数并使用该*f*变量,这太关键了,不能听天由命)。甚至在这里添加一条注释来解释您永远不应该向*f*变量写入任何内容,只是为了提醒自己永远不要这样做。
编辑:顺便说一句,DWL文件很少被任何人打开。当有人打开/关闭DWG文件时,只需几秒钟。所以你不需要检查。您也可以以只读方式打开DWL文件,即(打开“FileName.DWL”“r”),然后逐行阅读以找到打开它的用户-这基本上是WHOHAS命令所做的。第一行是用户名,第二行是计算机名,第三行是打开日期和时间。
此外,我认为您误解了李关于检查DWL文件的建议。如果它存在,则通常意味着有人打开了DWG。如果找不到,则DWG肯定未打开。 我会这样做:
请注意,所有返回都是列表-因此无论是否涉及DWL,它都以相同的方式工作。如果有DWL,它也会返回其中的数据。 AutoCAD崩溃并离开文件时除外。实际上,我编写了一个小例程,在启动时扫描活动图形的文件夹,并删除任何dwl/dwl2、err/log文件。 和我在第4篇文章中提到的一样。这就是为什么我说“通常”。
...
我希望你的例行公事不会简单地把它们全部删除!从那时起,您将获得我的函数返回的UnknownReady。 我知道,我只是重申一下。
如果激活图形正在使用它们,则不会删除它们。 优秀:o。
所以你可以找出谁在画这幅画。 哦好啊抱歉:眨眼:
其他人打开的DWG以及您已经打开的DWG呢?
欢迎
这是一个想法,不过如果你运行了类似Alan的代码,那么你就不会有任何DWL可用-除了你自己打开的当前DWG之一。 正如一个附带的建议:将这样的东西作为登录脚本运行不是“更好”吗?尽管如此,我还是会在删除之前添加一些形式的检查,因为其他人可能在登录之前已经打开了DWG。 vl file delete不会删除它们,为零并继续下一个文件。
页:
1
[2]