¿Cómo puedo atrapar un intento de escribir en un archivo abierto?Hola, tengo un script JSL que solicita al usuario que guarde una selección de gráficos JMP que acaba de generar un análisis directamente en una presentación de PowerPoint.Es probable que el usuario quiera inspeccionar las diapositivas resultantes de inmediato, por lo que no quiero cerrar el archivo de PowerPoint automáticamente, pero si el usuario intenta agregar alguna más gráficos con una segunda ejecución del script, recibirán una alerta JMP que les indicará que están tratando de sobrescribir un archivo que podría estar abierto en otro programa (lo cual, por supuesto, lo está).
Intenté atrapar un intento que podría fallar con la función Try(), pero esto no parece funcionar: el error ocurre de todos modos, y aunque JMP Alert le dice correctamente al usuario cuál es el problema, no lo hago. realmente quiero mensajes de error que interrumpan el flujo del programa.Pensé que usar la función "Se puede escribir en el archivo ()" para verificarlo con anticipación lo resolvería, pero eso tampoco parece funcionar: el archivo de PowerPoint es considera que se puede escribir, aunque esté abierto.
En este momento estoy poniendo un mensaje en la pantalla - si el archivo ya existe (que obviamente lata verificar) - advirtiendo al usuario por adelantado que si está abierto, deberán cerrarlo antes de continuar, pero esto es un poco poco elegante y realmente no resuelve el problema.¿Hay alguna manera de (a) verificar automáticamente que no esté abierto y (b) cerrarlo si es necesario?
Gráficossecuencias de comandosRe: ¿Cómo puedo atrapar un intento de escribir en un archivo abierto?Puedes usar
mylist = get log();
y luego analice mylist para ver si se produjo la advertencia y, de ser así, realice la acción que desea realizar.
Re: ¿Cómo puedo atrapar un intento de escribir en un archivo abierto?txt = logcapture(...jsl that might make log messages...)
también podría ayudar con el mismo enfoque.
editar: es posible que necesite Crear error de conexión de base de datos también, que muestra cómo usar BatchInteractive() para suprimir un cuadro de diálogo y solo obtener un mensaje de registro. ...y más sobre lote interactivo .
Re: ¿Cómo puedo atrapar un intento de escribir en un archivo abierto?Muchas gracias, Jim y Craige. Ahora tengo una solución funcional que es una amalgama de sus dos recomendaciones.Tuve que usar el comando "Batch Interactive" porque la alerta JMP no se enviaba al registro, pero no pude hacer funcionar el comando logcapture(), mientras que << get log() hizo lo que necesitaba.
Observo que el registro debe borrarse cada vez, o el mismo mensaje de error aparece en cada ejecución posterior.Solo para que conste, he incluido una versión simplificada de mi guión final a continuación.(Supongo que el segundo término "Batch Interactive (bi) vuelve a activar la Alerta JMP interactiva, ¿no es así?)"
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)
)
);