Comment puis-je piéger une tentative d'écriture dans un fichier ouvert ?Salut - J'ai un script JSL qui invite l'utilisateur à enregistrer une sélection de graphiques JMP qui viennent d'être générés par une analyse directement dans une présentation PowerPoint.L'utilisateur voudra probablement inspecter les diapositives résultantes immédiatement, donc je ne veux pas fermer le fichier PowerPoint automatiquement - mais si l'utilisateur essaie ensuite d'ajouter un Suite graphiques avec une deuxième exécution du script, ils recevront une alerte JMP leur indiquant qu'ils essaient d'écraser un fichier qui pourrait être ouvert dans un autre programme (ce qui est bien sûr le cas).
J'ai essayé de piéger une tentative qui pourrait échouer avec la fonction Try(), mais cela ne semble pas fonctionner : l'erreur se produit quand même - et bien que l'alerte JMP indique correctement à l'utilisateur quel est le problème, je ne le fais pas veulent vraiment des messages d'erreur interrompant le flux du programme.Je pensais que l'utilisation de la fonction "Is File Writable()" pour le vérifier à l'avance réglerait le problème, mais cela ne semble pas fonctionner non plus: le fichier PowerPoint est considéré comme accessible en écriture, même s'il est ouvert.
En ce moment, j'affiche un message à l'écran - si le fichier existe déjà (ce que je boîte vérifier) - avertir l'utilisateur à l'avance que si c'est ouvert, ils devront le fermer avant de continuer - mais c'est un peu inélégant et ne résout pas vraiment le problème.Existe-t-il un moyen de (a) vérifier automatiquement qu'il n'est pas déjà ouvert et (b) de le fermer si nécessaire ?
GraphiqueScriptRe : Comment puis-je intercepter une tentative d'écriture dans un fichier ouvert ?Merci beaucoup Jim et Craige - j'ai maintenant une solution de travail qui est un amalgame de vos deux recommandations.J'ai dû utiliser la commande "Batch Interactive" car l'alerte JMP n'était pas envoyée au journal, mais je n'ai pas pu faire fonctionner la commande logcapture(), alors que << get log() a fait ce dont j'avais besoin.
Je note que le journal doit être effacé à chaque fois, sinon le même message d'erreur est récupéré à chaque exécution suivante.Juste pour mémoire, j'ai inclus une version simplifiée de mon script final ci-dessous.(Je suppose que le deuxième terme "Batch Interactive (bi) réactive l'alerte JMP interactive - n'est-ce pas ?)"
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)
)
);Re : Comment puis-je intercepter une tentative d'écriture dans un fichier ouvert ?txt = logcapture(...jsl that might make log messages...)
pourrait également aider avec la même approche.
edit : vous pourriez avoir besoin Créer une erreur de connexion à la base de données aussi, qui montre comment utiliser BatchInteractive() pour supprimer une boîte de dialogue et simplement obtenir un message de journal. ...et en savoir plus sur batch interactif .
Re : Comment puis-je intercepter une tentative d'écriture dans un fichier ouvert ?Vous pouvez utiliser
mylist = get log();
puis parcourez mylist pour voir si l'avertissement s'est produit et si c'est le cas, prenez ensuite l'action que vous souhaitez entreprendre.