如何强制 JMP 以只读模式打开文件?各位,
我使用一种方法来更新插件,如中所述https://community.jmp.com/t5/JMP-Scripts/How-to-write-self-updating-JMP-add-ins/ta-p/21932/jump-to/first-unread-message经过@杰夫·珀金森。 JMP启动时需要打开一个文件“metadata.jmp”。 我在许多用户自动打开此文件时遇到了一些问题,因为在某些情况下,用户可能会长时间保持该文件打开(不知道这一点),然后我无法更新此文件。
此外,在其他情况下(许多用户共享的大型数据表),以只读模式打开文件可能会更好。
是否可以强制 JMP 以只读模式打开数据表等?
自动化和脚本编写数据混合和清理回复:如何强制 JMP 以只读模式打开文件?谢谢大家这么多的建议,我会尝试一下并找到一个好的解决方案。
回复:如何强制 JMP 以只读模式打开文件?@乔治
关于您的应用程序的一些假设。
1. 多人不同时写入元数据
2. 这是对“我的应用程序之一有新版本吗?”的只读调用。它在哪里?”
如果这两个都是真的,那么我通常会实际使用 SQLite 数据库并对其进行 ODBC 调用。如果您所做的只是检索元数据,我不会说需要很多花里胡哨的东西。另外,您还可以执行诸如将插件实际存储在数据库中之类的操作。JMP 表格适用于很多事情。但对于这个特定的应用程序,我认为这是矫枉过正。如果这只是一个一次性的调用,当您看到是否有新版本时就会立即关闭,......
您仍然可以轻松地编写脚本。同样,如果多个用户同时写入,这将无法正常工作。 最重要的是,当 JMP 打开 CSV 时,它不会像使用 JMP 表那样锁定原始文件。
Names default to here( 1 );
dt = open("$SAMPLE_DATA\Big Class.jmp");
csv_path = convert file path("$DESKTOP\Big Class.csv");
dt << Save As(csv_path);
close(dt, no save);
dt_csv = open(csv_path);
dt_csv << Add Rows({:name = "Fake", :age = 14, :sex = "F", :height = 14, :weight = 28});
dt_csv:age[1] = 0;
// I can still delete this file even though I have the table open
show(delete file(csv_path));
dt_csv << Save As(csv_path);
我通常会选择不使用 JMP 表功能,而不是处理多个权限级别。因为如果您在 JMP 脚本中打开 csv,它将打开一个未绑定的 JMP 表
回复:如何强制 JMP 以只读模式打开文件?以隐藏或只读方式保存到磁盘有一个 RunProgram 片段来运行 DOS attrib 命令。 您可以将文件标记为只读,或清除该标志。
回复:如何强制 JMP 以只读模式打开文件?一个建议:插件管理器那@Justin_Chilton创建的方法自动化了@杰夫·珀金森描述。该加载项更新包含用户读取的关联数组的 .jsl 文件。
回复:如何强制 JMP 以只读模式打开文件?@vince_faller谢谢,就我而言,首选 jmp 表,我有一个小表,我需要编辑(通过 JMP)。
在另一种情况下,当我有很多用户使用的大型表时,jmp 表也会更好,因为不需要转换,不是吗?
此外,jmp 表具有更多功能(脚本、数据类型……),因此我始终更喜欢 jmp 表作为文件类型。
回复:如何强制 JMP 以只读模式打开文件?你能把你的 JMP 表做成 csv 吗?
回复:如何强制 JMP 以只读模式打开文件?@ih感谢您的想法,我会尽力找到一个好的工作解决方案。
在文件系统中设置权限是我更喜欢的直接解决方案,但详细查看它(文件位于文件服务器上),我发现许多用户需要设置权限,因此结果很复杂。 因为我们有几百个用户使用这些文件,而且我不知道他们在哪些用户下操作。
只是我有另一个想法:
- 将文件复制到 $TEMP 然后打开它
回复:如何强制 JMP 以只读模式打开文件?我不确定如何以只读方式打开文件(如果有人知道请插话),但以下一些想法可能会帮助您缓解问题:
- 更改文件权限,以便大多数用户对该文件具有只读访问权限。
- 使需要打开文件的代码部分变得简短,并将其包装在 try 块中。在处理文件操作的 try 块之后或在 catchExpr 部分中,包含用于关闭文件的代码。例如:
try(
//Work with the file here
dt = Open("a file");
values = dt:Column << get values;
dt << Close;
, //This is the catchExpr, it is executed on an error.
//Make sure the file is closed, but don't throw another if it wasn't open.
try( dt << Close );
//Now raise an error.
throw( "Error working with metadata file: " || char( Exception_msg ) );
);
//Or you could close the file in a subsequent try function
try(
//Work with the file here
dt = Open("a file");
values = dt:Column << get values;
);
try( dt << Close );
//Now do any time consuming functions on the data extracted from that file
//show(values);