如何提示“文件正在使用”消息你好,
我目前正在创建一个用作数据库的 JMP 文件。因此,当其他人已打开数据库并正在对文件进行更改时,我想提示“文件正在使用”消息并保持文件锁定以供编辑。例如,当您在其他人已使用的服务器位置上打开 Excel 文件时,您会收到相同的消息:

我认为我已经在以下社区帖子中找到了部分答案: 多用户访问
如果我是正确的,我仍然需要弄清楚当另一个用户打开该表时如何锁定它。
有人可以帮忙创建这样的脚本吗?
谢谢
数据访问回复:如何提示“文件正在使用”消息它可能适用于 JMP 14。 我报告了我看到的 JMP 15/16 问题。
如果你必须让它在 15 中工作,你可以像我在 FileSnapper 加载项中使用的这个函数那样做。
FileSnapper:isFileOpenElsewhere = Function( {filepath}, {dt, savelog},
If( endswith(filepath,".jmp") & File Exists( filepath ),
dt = Open( filepath, private );
savelog = Log Capture( dt << save );
close(dt,"nosave");
Length( savelog ) != 0; // error message means another JMP has dt open
, // else
0 // not open if not exists
)
);它的工作原理是在打开文件后立即尝试保存文件并捕获日志消息。 如果没有日志消息,则保存成功。 你想重新安排一下,如果保存成功,可能不会关闭表格,而不是使用私人的. 缺点是如果文件非常大,额外的保存可能需要一些时间,并且它会加倍保存期间发生电源故障的机会,从而损坏数据。 (对于 FileSnapper,该文件是一个哨兵,很小,即将被删除,并且每次都重新创建,所以它可以正常工作。)
回复:如何提示“文件正在使用”消息好的,感谢您调查这个克雷格。
我将尝试在我的 JMP 文件中设置来自 David 的脚本。
回复:如何提示“文件正在使用”消息唔。 我可以看到它在 JMP 14 中有效,但可能不适用于 15。
回复:如何提示“文件正在使用”消息David 的脚本具有检查可见指示的代码:
Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.Several copies of JMP open, same table in two copies, one of them is locked out by the other.打开 JMP 的几个副本,同一个表有两个副本,其中一个被另一个锁定。
回复:如何提示“文件正在使用”消息感谢克雷奇的回应。
是否可以提示消息/警告该文件已被其他人使用? 目前,第二个用户可能不知道该文件已被另一个用户打开。 因此,如果第二个用户对文件进行了任何更改,这些更改将无法保存到原始文件中。
回复:如何提示“文件正在使用”消息JMP 表被第一个打开它的用户锁定以供写入。 后续用户获得只读访问权限(他们无法保存更改)。 剧本@David_Burnham wrote 假定拥有锁的用户将很快关闭表(尝试 200 次),然后为新用户打开表,这应该为新用户获得锁。 对于使用精心编写的程序更新表的 2 或 3 个用户来说,它可能工作得很好。 它不适用于可能打开桌子然后不关闭它就去吃午饭的用户。
回复:如何提示“文件正在使用”消息你能发布测试吗?该文件是网络文件还是本地文件?我不确定 JMP 或操作系统可能会采取什么不同的做法,但至少有时我认为 JMP 会保存到备用文件,然后删除/重命名/交换以使断电故障的窗口尽可能小。可能是该过程受到阻碍。 @briancorcoran
回复:如何提示“文件正在使用”消息对于 OneDrive 上有文件的网络驱动器(在我的实例中),问题会更严重。但我的测试是使用本地文件。 Windows 10、JMP 17。
脚本“locktest1”和“locktest2”相同,只是第一个脚本更新结果表的第 1 列,而第二个脚本更新第 2 列。
通过在单独的 JMP 实例中同时运行每个脚本,可以对处理文件锁的逻辑进行压力测试。
脚本的第 75 行包含结果表的路径。将结果表放置在合适的位置并更新路径变量以指向此位置。
打开 JMP 会话并打开 locktest1。显示嵌入的日志。
打开第二个 JMP 会话并打开 loctest2,带有嵌入日志。
运行两个脚本(我运行第一个脚本,等到日志显示 i=5 然后再运行第二个脚本,但这只是迷信)。
第 79 行定义的循环执行 50 次迭代。如果两个脚本成功完成,则结果应该是结果表的两列中分别包含 1 到 50 的数字。
有一个表格脚本可让您重置表格内容。
实践中,有 3 种可能的故障模式:
- 显示一条或多条“无法获取文件结尾标记”消息。保存时出现此错误,无法保存结果。因此,结果表中会存在一些缺失值。
- 在某些时候,结果表将会消失。如果找不到该文件,脚本将中止执行并显示“文件未找到”消息。
- 有时,两个脚本都无法获得表上的锁。这由两个脚本都尝试获取锁定 500 次来表明。如果您中止脚本,然后尝试打开结果表,它将有一个file_lock表变量。 JMP 的两个实例都会锁定表。解锁它的唯一方法是关闭 JMP 的两个会话。
50 次迭代通常足以观察 (1) 和 (2),但有时您需要增加迭代次数才能观察 (2)。场景 (3) 更有可能发生 100 次迭代并且消除了第 100 行的等待。
回复:如何提示“文件正在使用”消息在测试中,我发现一种情况,我可以打开表,而savelog中没有任何消息,但当我保存时,却收到错误“无法获取文件结尾标记”。这不仅会阻止保存最新数据,而且整个文件都会消失,所有数据都会丢失。
在测试环境中,我有 2 个脚本,除了一个脚本更新表的第一列,第二个脚本更新第二列外,其余脚本完全相同。每个脚本尝试更新表 100 次。如果打开时(通过savelog )报告表已锁定,则它会等待并重新尝试(按照我原来的脚本)。但是,在 100 次尝试中,可能会有一两次出现文件结尾标记错误。这可能发生在打开文件时(使用savelog测试)或保存结果时(关闭并保存,假设有写访问权限)。我在关闭时实施了类似的savelog测试,但那时已经太晚了,损害已经造成。
我对此错误的经验是,如果您在尝试保存结果时遇到此错误,您将面临大麻烦,并且可能会完全丢失表格。因此,我尝试通过在打开表格时尝试可靠地获得读写访问权限来集中精力消除第一次发生的错误。99% 的时间我都做到了这一点,但最终我总会遇到错误。我怀疑发生的事情是,两个脚本都获得对文件的读写访问权限的可能性很小(至少,如 savelog 所报告的),但在某个时候,一个脚本保持读写访问权限,而另一个脚本获得文件末尾标记错误 - 可能是在另一个脚本进行了更新时)。
回复:如何提示“文件正在使用”消息抱歉,我忘了这件事了。我拍了一段数据表从桌面上消失的视频,并将其发送给了开发团队。谢谢!