AppleScript: ¿Cómo crear un archivo que contenga una barra diagonal en su nombre de archivo?

0

Tengo un servicio que crea un nuevo archivo .txt o .rtf. El Servicio guarda este archivo en el disco. El nombre de archivo de este archivo es proporcionado por el usuario a través de un diálogo de entrada. Pero, he encontrado que si el nombre del archivo contiene una barra diagonal ( / ), entonces el archivo no se creará.

Supongamos que me gustaría crear un archivo titulado: Este es mi / file.txt .

Puedo crear este archivo manualmente en Finder.app sin error, lo que indica que el sistema operativo permite barras diagonales en los nombres de archivo (a diferencia de los dos puntos, por ejemplo).

Aquí hay un código (es decir, un fragmento de mi Servicio) para reproducir el error:

set theCustomFilename to text returned of (display dialog "Enter filename:
" default answer "This is my /file")

set thePath to "/Users/Me/Desktop/"
set theFileExtension to ".txt"
set theCustomFilePathname to thePath & theCustomFilename & theFileExtension

try
    set fileHandle to open for access theCustomFilePathname with write permission
    write "This is the document text." to fileHandle
    close access fileHandle
on error eStr number eNum
    display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "File I/O Error..." with icon caution
    try
        close access fileHandle
    end try
end try

Si ejecuta el código anterior, recibirá el error:

  

File / Users / Me / Desktop / Este es mi / file.txt no se encontró. número -43

    
pregunta rubik's sphere 09.05.2017 - 07:27

3 respuestas

3

Nunca debes usar la barra diagonal (/) en tus nombres de archivo.

Como experimento, abrí TextEdit y guardé un archivo con una barra diagonal en el nombre

Listadodeloscomentariosdeldirectorioqueobtenemos:

$lstotal8drwxr-xr-x3areedstaff102BMay902:02.drwx------+29areedstaff986BMay902:05..-rw-r--r--@1areedstaff325BMay902:00Test:this.rtf

Cambialabarrainclinadahaciaafueraadospuntos.

Sucedealgointeresantecuandousaslafuncióndeautocompletardebash;pulsalapestañamásdeunavezy,enlugarde"detener" cuando encuentra la coincidencia completa, continúa:

$ cat Test\:this.rtf Test\:this.rtf Test\:this.rtf Test\:this.rtf Test\:this.rtf Test\:this.rtf

En el ejemplo anterior, escribí cat Tes y luego presioné Tabulación 5 veces. En lugar de emitir pitidos y detenerse, se repetía como si estuviera atrapado en un bucle; este no es el comportamiento correcto.

Al realizar una búsqueda sobre este comportamiento, me topé con este artículo de C | Net: No use" barra inclinada "en los nombres de archivo de Mac OS X, ejemplo de Distiller 6.0 . El artículo se cita diciendo:

  

La barra diagonal hacia delante tampoco debe usarse nunca en el nombre de una unidad o   partición, o virtualmente en cualquier otro campo de nombre en Mac OS X. La   La razón detrás de esta limitación proviene de los fundamentos UNIX de Mac OS X

     

En versiones anteriores de Mac OS, la ubicación de un archivo se anotaba usando una   Ruta, con los dos puntos (:) separando objetos. Mac OS X usa el   barra diagonal (/) en lugar de los dos puntos.

Parece que este comportamiento / limitación todavía está presente en macOS. En pocas palabras, no use la barra inclinada en su nombre de archivo.

    
respondido por el Allan 09.05.2017 - 08:18
1

La confusión que está teniendo es porque el Finder le permite usar / en un nombre de archivo asignando / a : debajo del capó. En el sistema de archivos, no se le permite a no tener un nombre de archivo que contenga un carácter / , pero se le permite un carácter : .

Esto se debe a que MacOS original utilizó : como separador de ruta, mientras que OS X, como todos los sistemas operativos basados en Unix, usó / , por lo que el Finder se escribió para asignar uno a otro.

En su código AppleScript está utilizando rutas de Unix, por lo que el código falla. En su lugar, use un carácter : en su código y verá un / en el nombre del archivo en el Finder.

    
respondido por el Tony Williams 09.05.2017 - 08:20
0

Existe una solución.

He descubierto un método que permite un carácter de barra diagonal en un nombre de archivo. Mi solución está inspirada en el código proporcionado en esta respuesta , escrita por el usuario 3439894.

Utilizando el código que proporcioné en mi publicación original, cambie esta línea:

  • set thePath to "/Users/Me/Desktop/"

a:

  • set thePath to POSIX file "/Users/Me/Desktop/"

Y, cambia esta línea:

  • set theCustomFilePathname to thePath & theCustomFilename & theFileExtension

a:

  • set theCustomFilePathname to (thePath & theCustomFilename & theFileExtension) as string

Ahora puede incluir con éxito un carácter de barra diagonal en el nombre de archivo, sin error, como lo puede hacer en Finder.app (o en el menú Guardar como en TextEdit. aplicación).

Solución menos controvertida:

Si está preocupado por las advertencias ofrecidas en las otras dos respuestas a esta pregunta, con respecto a los males de la barra diagonal, he ideado una solución completamente "por encima". (FWIW, nunca he visto que un carácter de barra diagonal en uno de mis nombres de archivo cause un problema anteriormente).

Uno puede simplemente reemplazar el símbolo estándar de barra diagonal en la cadena enviada por un símbolo alternativo de barra diagonal. El símbolo alternativo parece lo suficientemente parecido al símbolo real para mantener el efecto puntual deseado de una barra diagonal.

Esta solución es "menos controvertida" porque OS X no excluye este oscuro símbolo alternativo como un nombre de archivo.

Aquí está el código de AppleScript:

if theCustomFilename contains "/" then
    set theCustomFilename to replace_chars(theCustomFilename, "/", "∕")
end if

El código anterior utiliza una replace_chars sub-rutina . Esta subrutina reemplaza cada instancia de una subcadena definida en una cadena, con una nueva cadena:

on replace_chars(this_text, search_string, replacement_string)
    set AppleScript's text item delimiters to the search_string
    set the item_list to every text item of this_text
    set AppleScript's text item delimiters to the replacement_string
    set this_text to the item_list as string
    set AppleScript's text item delimiters to ""
    return this_text
end replace_chars
    
respondido por el rubik's sphere 10.06.2017 - 06:17

Lea otras preguntas en las etiquetas