0 votes

AppleScript : Comment créer un fichier qui contient une barre oblique dans son nom de fichier ?

J'ai un service qui crée un nouveau fichier .txt ou .rtf. Le service enregistre ce fichier sur le disque. Le nom de ce fichier est fourni par l'utilisateur via une boîte de dialogue de saisie. Mais j'ai constaté que si le nom de fichier contient une barre oblique ( / ), alors le fichier ne sera pas créé.

Supposons que je veuille créer un fichier intitulé : C'est mon / fichier.txt .

Je peux créer ce fichier manuellement dans Finder.app sans erreur, ce qui indique que le système d'exploitation autorise les barres obliques dans les noms de fichiers (contrairement aux deux points, par exemple).

Voici un extrait de code (c'est-à-dire un extrait de mon service) pour reproduire l'erreur :

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 vous exécutez le code ci-dessus, vous obtiendrez l'erreur suivante :

Le fichier /Users/Me/Desktop/This is my / file.txt n'a pas été trouvé. nombre -43

4voto

Douglas Points 10417

Vous ne devez jamais utiliser la barre oblique (/) dans vos noms de fichiers.

À titre expérimental, j'ai ouvert TextEdit et enregistré un fichier dont le nom contient une barre oblique.

enter image description here

Lister les commentaires de l'annuaire que nous recevons :

$ 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

Il change la barre oblique en deux points.

Une chose intéressante se produit lorsque vous utilisez bash Appuyez plusieurs fois sur la touche de tabulation et au lieu de s'arrêter lorsqu'il a trouvé la correspondance complète, il continue :

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

Dans l'exemple ci-dessus, j'ai tapé cat Tes et a ensuite appuyé sur Tab 5 fois. Au lieu de biper et de s'arrêter, il a continué à répéter comme s'il était coincé dans une boucle ; ce n'est pas un comportement correct.

En faisant une recherche sur ce comportement, je suis tombé sur cet article de C|Net : Ne pas utiliser de "barre oblique" dans les noms de fichiers Mac OS X, exemple de Distiller 6.0 . L'article est cité comme disant :

La barre oblique ne doit jamais être utilisée dans le nom d'un lecteur ou d'une partition. partition, ou pratiquement dans tout autre champ de nom dans Mac OS X. Le site raison de cette limitation provient des fondements UNIX de Mac OS X.

Dans les versions antérieures de Mac OS, l'emplacement d'un fichier était noté à l'aide de l'icône avec les deux points ( :) pour séparer les objets. Mac OS X utilise le barre oblique ( /) à la place des deux points.

Il semble que ce comportement/limitation soit toujours présent dans MacOS. En résumé, n'utilisez pas la barre oblique dans votre nom de fichier.

4voto

Tony Williams Points 11219

La confusion que vous rencontrez est due au fait que le Finder vous permet d'utiliser les éléments suivants / dans un nom de fichier en faisant correspondre l'élément / a : sous le capot. Dans le système de fichiers lui-même, vous êtes pas autorisé à avoir un nom de fichier contenant un / mais vous avez droit à un caractère : caractère.

Cela s'explique par le fait que le MacOS original utilisait le format : comme séparateur de chemin alors que OS X, comme tous les systèmes d'exploitation basés sur Unix, utilisait / donc le Finder a été écrit pour faire correspondre l'un à l'autre.

Dans votre code AppleScript, vous utilisez des chemins Unix et le code échoue. Utilisez plutôt un : dans votre code et vous verrez apparaître un / dans le nom du fichier dans le Finder.

0voto

rubik's sphere Points 4760

Il existe une solution.

J'ai trouvé une méthode qui permet d'utiliser un caractère forward-slash dans un nom de fichier. Ma solution s'inspire du code fourni dans cette réponse écrit par l'utilisateur3439894.

En utilisant le code que j'ai fourni dans mon message original, modifiez cette ligne :

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

à :

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

Et, changez cette ligne :

  • set theCustomFilePathname to thePath & theCustomFilename & theFileExtension

à :

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

Vous êtes maintenant en mesure d'inclure avec succès un caractère forward-slash dans le nom de fichier, sans erreur, tout comme vous êtes libre de le faire dans Finder.app (ou à partir de l'application Save As dans TextEdit.app).


Une solution moins controversée :

Si vous vous inquiétez des remontrances faites dans les deux autres réponses à cette question, concernant les méfaits de la barre oblique, j'ai conçu une solution tout à fait "honnête". (Pour info, je n'ai jamais vu un caractère slash avant dans l'un de mes noms de fichiers causer un problème auparavant).

On peut simplement remplacer le symbole standard de la barre oblique dans la chaîne soumise par un autre symbole de barre oblique. Le symbole alternatif est suffisamment proche du symbole réel pour que l'effet de ponctuation souhaité d'une barre oblique soit maintenu.

Cette solution est "moins controversé" car OS X n'interdit pas ce symbole alternatif obscur comme caractère de nom de fichier.

Voici le code AppleScript :

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

Le code ci-dessus utilise un replace_chars sous-routine . Cette sous-routine remplace chaque instance d'une sous-chaîne définie dans une chaîne, par une nouvelle chaîne :

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

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X