乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: Ahankhah

[编程交流] 如何区分只读

[复制链接]

91

主题

428

帖子

326

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
474
发表于 2022-7-6 09:50:33 | 显示全部楼层
特别感谢你们,以下是一个完整的函数,作为你们提供的方法的总结:
 
  1. (defun [b]DwgFileStatus [/b](DwgName / *dwg* *folder* *name* *dwl* *ret* *f*)
  2.   (if (setq *dwg* (findfile DwgName))
  3.      (progn
  4.         (setq *folder* (vl-filename-directory *dwg*))
  5.         (setq *name* (vl-filename-base *dwg*))
  6.         (setq *dwl* (findfile (strcat *folder* "\" *name* ".dwl")))
  7.      )
  8.   )
  9.   (setq *ret*
  10.      (cond
  11.         (  (not *dwg*)
  12.            'NoSuchFile
  13.         )
  14.         (  (setq *f* (open *dwg* "a"))
  15.            'Editable
  16.         )
  17.         (  (not *dwl*)
  18.            'ReadOnly
  19.         )
  20.         (  (setq *f* (open *dwl* "a"))
  21.            'EditableAfterCrash
  22.         )
  23.         (  (not *f*)
  24.            'InUse
  25.         )
  26.         (  T
  27.            'NotProspected
  28.         )
  29.      )
  30.   )      
  31.   (if *f* (close *f*))
  32.   *ret*
  33. )
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:52:20 | 显示全部楼层
它将受到文件状态的影响,因为我打开它是为了进行写访问(请注意“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肯定未打开。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:55:08 | 显示全部楼层
我会这样做:
请注意,所有返回都是列表-因此无论是否涉及DWL,它都以相同的方式工作。如果有DWL,它也会返回其中的数据。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 09:59:49 | 显示全部楼层
AutoCAD崩溃并离开文件时除外。实际上,我编写了一个小例程,在启动时扫描活动图形的文件夹,并删除任何dwl/dwl2、err/log文件。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 10:03:12 | 显示全部楼层
和我在第4篇文章中提到的一样。这就是为什么我说“通常”。 
...
 
我希望你的例行公事不会简单地把它们全部删除!从那时起,您将获得我的函数返回的UnknownReady。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 10:04:22 | 显示全部楼层
我知道,我只是重申一下。
 
如果激活图形正在使用它们,则不会删除它们。
回复

使用道具 举报

91

主题

428

帖子

326

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
474
发表于 2022-7-6 10:08:47 | 显示全部楼层
优秀:o。
所以你可以找出谁在画这幅画。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 10:09:49 | 显示全部楼层
哦好啊抱歉:眨眼:
其他人打开的DWG以及您已经打开的DWG呢? 
欢迎 
这是一个想法,不过如果你运行了类似Alan的代码,那么你就不会有任何DWL可用-除了你自己打开的当前DWG之一。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 10:12:56 | 显示全部楼层
正如一个附带的建议:将这样的东西作为登录脚本运行不是“更好”吗?尽管如此,我还是会在删除之前添加一些形式的检查,因为其他人可能在登录之前已经打开了DWG。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 10:16:50 | 显示全部楼层
vl file delete不会删除它们,为零并继续下一个文件。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-7 03:28 , Processed in 0.546620 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表