AppleScript: come creare un file che contiene una barra in avanti nel suo nome file?

0

Ho un servizio che crea un nuovo file .txt o .rtf. Il servizio salva questo file sul disco. Il nome file di questo file è fornito dall'utente tramite una finestra di dialogo di immissione. Ma, ho trovato che se il nome del file contiene una barra ( / ), allora il file non verrà creato.

Supponiamo che mi piacerebbe creare un file dal titolo: Questo è il mio / file.txt .

Posso creare manualmente questo file in Finder.app senza errori, il che indica che il sistema operativo consente di inserire barre nei nomi dei file (a differenza dei due punti, ad esempio).

Ecco un codice (ad esempio uno snippet dal mio servizio) per riprodurre l'errore:

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

Se esegui il codice sopra, ti verrà dato l'errore:

File /Users/Me/Desktop/This is my / file.txt wasn’t found. number -43

    
posta rubik's sphere 09.05.2017 - 07:27
fonte

3 risposte

3

Non dovresti mai usare la barra (/) nei tuoi nomi di file.

Come esperimento, ho aperto TextEdit e salvato un file con una barra in avanti nel nome

Elencodeicommentidelladirectorycheotteniamo:

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

Cambialabarrainavantiaduepunti.

Unacosainteressanteaccadequandousilafunzionedicompletamentoautomaticodibash;premiiltabpiùdiunavoltaeinvecedi"fermarti" quando ha trovato la corrispondenza completa, continua:

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

Nell'esempio precedente, ho digitato cat Tes e poi premuto Tab 5 volte. Invece di suonare e fermarsi, continuava a ripetersi come se fosse bloccato in un loop; questo non è un comportamento corretto.

Facendo una ricerca su questo comportamento, mi sono imbattuto in questo articolo da C | Net: Non utilizzare" barra in avanti "nei nomi file di Mac OS X, esempio di Distiller 6.0 . L'articolo è citato come dicendo:

The forward slash should also never be used in the name of a drive or partition, or virtually in any other name field in Mac OS X. The reason behind this limitation stems from Mac OS X's UNIX underpinnings

In prior versions of Mac OS the location of a file was noted using a path, with the colon ( :) separating objects. Mac OS X uses the forward slash ( /) in place of the colon.

Sembra che questo comportamento / limitazione sia ancora presente in macOS. In conclusione, non utilizzare la barra in avanti nel nome del file.

    
risposta data 09.05.2017 - 08:18
fonte
1

La confusione che stai avendo è perché il Finder ti permette di usare / in un nome di file mappando il / a : sotto il cofano. Nel file system stesso sei non permesso che il nome di un file contenga un carattere / ma ti è consentito un carattere : .

Questo è avvenuto perché il MacOS originale usava : come separatore di percorso mentre OS X, come tutti i sistemi operativi basati su Unix, usava / in modo che il Finder fosse scritto per mappare l'uno con l'altro.

Nel tuo codice AppleScript stai utilizzando i percorsi Unix in modo che il codice non funzioni. Utilizza invece un carattere : nel codice e vedrai un / nel nome file nel Finder.

    
risposta data 09.05.2017 - 08:20
fonte
0

Esiste una soluzione.

Ho scoperto un metodo che consente un carattere di barra in avanti in un nome file. La mia soluzione è ispirata al codice fornito in questa risposta , scritta dall'utente3439894.

Usando il codice che ho fornito nel mio post originale, cambia questa riga:

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

a:

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

E, cambia questa riga:

  • set theCustomFilePathname to thePath & theCustomFilename & theFileExtension

a:

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

Ora puoi includere correttamente un carattere di barra in avanti nel nome del file, senza errori, proprio come sei libero di fare in Finder.app (o dal menu Salva con nome in TextEdit. app).

Soluzione meno controversa:

Se sei preoccupato per le ammonizioni offerte nelle altre due risposte a questa domanda, per quanto riguarda i mali della barra in avanti, ho escogitato una soluzione completamente "sopra la testa". (FWIW, non ho mai visto un carattere di barra in avanti in uno dei miei nomi di file a causare un problema prima.)

Si può semplicemente sostituire il simbolo standard di barra in avanti nella stringa inviata con un simbolo alternativo di barra in avanti. Il simbolo alternativo sembra abbastanza vicino al simbolo reale per mantenere l'effetto di punteggiatura desiderato di una barra in avanti.

Questa soluzione è "meno controversa" perché OS X non impedisce questo oscuro simbolo alternativo come carattere di nome file.

Ecco il codice AppleScript:

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

Il codice sopra riportato utilizza una % sub-routine di% co_de . Questa sub-routine sostituisce ogni istanza di una sottostringa definita in una stringa, con una nuova stringa:

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
    
risposta data 10.06.2017 - 06:17
fonte

Leggi altre domande sui tag