0 votos

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

Tengo un Servicio que crea un nuevo archivo .txt o .rtf. El Servicio guarda este archivo en el disco. El nombre de este archivo es proporcionado por el usuario a través de un cuadro de diálogo de entrada. Sin embargo, he descubierto que si el nombre del archivo contiene una barra inclinada hacia adelante (/), entonces el archivo no será creado.

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

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

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

set theCustomFilename to text returned of (display dialog "Introduzca el nombre del archivo:
" default answer "Este es mi /archivo")

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 "Este es el texto del documento." to fileHandle
    close access fileHandle
on error eStr number eNum
    display dialog eStr & " número " & eNum buttons {"OK"} default button 1 with title "Error de E/S de archivo..." with icon caution
    try
        close access fileHandle
    end try
end try

Si ejecutas el código anterior, se te dará el error:

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

0 votos

¿Cómo se supone que AppleScript sabrá cuáles de los / en theCustomFilePathname son separadores de directorio y cuáles son parte de un nombre de carpeta o archivo?

0 votos

Eso es correcto. Había simplificado demasiado mi publicación. En mi código real, el nombre de archivo se encuentra en su propia variable. Por favor, revisa mi edición.

0 votos

Esto no cambia el valor de theCustomFilePathname una vez que se asigna, ¡ahí todavía tienes el mismo problema :-)

4voto

Douglas Puntos 10417

Jamás debes usar la barra diagonal (/) en tus nombres de archivos.

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

enter image description here

Listando los comentarios del directorio obtenemos:

$ ls
total 8
drwxr-xr-x   3 areed  staff   102B May  9 02:02 .
drwx------+ 29 areed  staff   986B May  9 02:05 ..
-rw-r--r--@  1 areed  staff   325B May  9 02:00 Test:this.rtf

Cambia la barra diagonal por dos puntos.

Algo interesante sucede cuando usas la función de autocompletar de bash; presiona la tecla tab más de una vez y en lugar de "detenerse" cuando ha encontrado la coincidencia completa, sigue:

$ 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é Tab 5 veces. En lugar de sonar y detenerse, siguió repitiéndose como si estuviera atascado en un bucle; este no es un comportamiento correcto.

Al hacer una búsqueda sobre este comportamiento, me topé con este artículo de C|Net: No uses "barra diagonal" en los nombres de archivos de Mac OS X, ejemplo de Distiller 6.0. El artículo dice:

La barra diagonal tampoco debe usarse en el nombre de un disco o partición, ni prácticamente en ningún otro campo de nombre en Mac OS X. La razón detrás de esta limitación se deriva de las bases UNIX de Mac OS X

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

Parece que este comportamiento/limitación todavía está presente en macOS. En resumen, no uses la barra diagonal en el nombre de tu archivo.

0 votos

Si "Nunca deberías utilizar la barra inclinada (/) en tus nombres de archivo", entonces ¿por qué Apple permite el uso de la barra inclinada al nombrar o renombrar un archivo en Finder? Apple fácilmente podría haber prohibido este caracter en los nombres de archivos si hubieran querido, de la misma manera en que lo hicieron con dos puntos.

3 votos

No puedo responder por qué Apple hace o no hace algo, solo Apple puede hacerlo. Todo lo que puedo decirte es que hacerlo provoca un comportamiento extraño del sistema operativo al intentar trabajar con los archivos. El / se utiliza para delimitar las rutas y por lo que he observado, ponerlos en el nombre confunde las cosas.

2 votos

@rubik'ssphere No se le prohíbe el uso de una barra inclinada porque Finder la mapea automáticamente a : para usted (consulte la salida del Terminal al principio de la respuesta)

2voto

Tony Williams Puntos 4903

La confusión que tienes se debe a que el Finder te permite usar / en un nombre de archivo al mapear el / a : "por debajo". En el sistema de archivos en sí mismo no se te permite tener un nombre de archivo que contenga un carácter / pero sí se te permite un carácter :.

Esto ha ocurrido porque el MacOS original utilizaba el : como separador de ruta mientras que OS X, al igual que todos los sistemas operativos basados en Unix, utilizaba / por lo que el Finder fue programado para mapear uno a otro.

En tu código de AppleScript estás usando rutas de Unix por lo que el código falla. En su lugar utiliza un carácter : en tu código y verás un / en el nombre de archivo en el Finder.

0 votos

"En su lugar, use un carácter : en su código y verá una / en el nombre de archivo en el Finder." Acabo de intentar hacer esto con mi código de AppleScript, pero obtengo el mismo error.

0voto

rubik's sphere Puntos 31

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 user3439894.

Usando el código que proporcioné en mi publicación original, cambia 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 puedes incluir con éxito un carácter de barra diagonal en el nombre de archivo, sin errores, al igual que puedes hacerlo en Finder.app (o desde el menú Guardar como en TextEdit.app).


Solución menos controvertida:

Si te preocupa las advertencias ofrecidas en las otras dos respuestas a esta pregunta, respecto a los peligros de la barra diagonal, he ideado un método totalmente "legal". (Por cierto, nunca he visto que un carácter de barra diagonal en uno de mis nombres de archivo cause un problema antes).

Simplemente se puede reemplazar el símbolo de barra diagonal estándar en la cadena enviada con un símbolo de barra diagonal alternativo. El símbolo alternativo se ve lo suficientemente parecido al verdadero símbolo para que se mantenga el efecto puntuacional deseado de una barra diagonal.

Esta solución es "menos controvertida" porque OS X no prohíbe este oscuro carácter alternativo como un carácter de nombre de archivo.

Este es el código de AppleScript:

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

El código anterior usa una subrutina replace_chars. 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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X