如何強制 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);