Come posso intercettare un tentativo di scrivere su un file aperto?Ciao - Ho uno script JSL che richiede all'utente di salvare una selezione di grafici JMP che sono stati appena generati da un'analisi direttamente in una presentazione PowerPoint.È probabile che l'utente desideri ispezionare immediatamente le diapositive risultanti, quindi non voglio chiudere automaticamente il file PowerPoint, ma se l'utente tenta di aggiungere qualsiasi di più grafica ad esso con una seconda esecuzione dello script, riceveranno un avviso JMP che li informa che stanno cercando di sovrascrivere un file che potrebbe essere aperto in un altro programma (che ovviamente lo è).
Ho provato a intercettare un tentativo che potrebbe fallire con la funzione Try(), ma questo non sembra funzionare: l'errore si verifica comunque - e sebbene l'avviso JMP indichi correttamente all'utente qual è il problema, non lo faccio vogliono davvero messaggi di errore che interrompono il flusso del programma.Pensavo che usare la funzione "È scrivibile file ()" per verificarlo in anticipo lo avrebbe affrontato, ma nemmeno questo sembra funzionare: il file PowerPoint è ritenuto scrivibile, anche se aperto.
Al momento sto mettendo un messaggio sullo schermo - se il file esiste già (che ovviamente io potere verifica) - avvisando l'utente in anticipo che Se è aperto, dovranno chiuderlo prima di procedere, ma questo è un po' poco elegante e non risolve il problema.C'è un modo per (a) verificare automaticamente che non sia già aperto e (b) chiuderlo se necessario?
GraficaSceneggiaturaRe: Come posso intercettare un tentativo di scrivere su un file aperto?Puoi usare
mylist = get log();
e quindi analizzare il mio elenco per vedere se si è verificato l'avviso e, in tal caso, eseguire l'azione che si desidera eseguire.
Re: Come posso intercettare un tentativo di scrivere su un file aperto?txt = logcapture(...jsl that might make log messages...)
potrebbe anche aiutare con lo stesso approccio.
modifica: potresti aver bisogno Crea errore di connessione al database anche, che mostra come utilizzare BatchInteractive() per sopprimere una finestra di dialogo e ottenere semplicemente un messaggio di registro. ...e altro su batch interattivo .
Re: Come posso intercettare un tentativo di scrivere su un file aperto?Molte grazie Jim e Craige: ora ho una soluzione funzionante che è un amalgama di entrambi i tuoi consigli.Ho dovuto usare il comando "Batch Interactive" perché l'avviso JMP non veniva inviato al registro, ma non riuscivo a far funzionare il comando logcapture(), mentre << get log() faceva ciò di cui avevo bisogno.
Prendo atto che il registro deve essere cancellato ogni volta o lo stesso messaggio di errore viene raccolto ad ogni esecuzione successiva.Solo per la cronaca, ho incluso una versione ridotta del mio script finale di seguito.(Immagino che il secondo termine "Batch Interactive(bi) riattivi l'avviso JMP interattivo - è giusto?)"
OutputFileName = "$DESKTOP\My Slides.pptx";
if(not(file exists(OutputFileName)),
// No possible problem here;
Text Box("New File - First Page") << save presentation(OutputFileName);
caption("You've just started a new presentation - here it is..."); wait(2); caption(remove);
open(OutputFileName)
,
// The file exists but it might be open - so be wary;
bi = Batch Interactive( 1 );
// If I don't clear the log first, it will tell me there's an error even when there isn't;
clear log();
Text Box("Existing File - Next Page") << save presentation(OutputFileName, append);
Error_List = get log();
if(contains(concat items(Error_List), "Unable to overwrite"),
beep();
caption("You can't write to the file\!rbecause it's open right now.\!rPlease close it, then try again.");
wait(3);
caption(remove);
Batch Interactive(bi)
,
caption("Here's the updated presentation with your latest slide"); wait(2); caption(remove);
open(OutputFileName)
)
);