2 votos

No se puede renombrar el archivo en Applescript

Siento que mis habilidades de AppleScript son muy deficientes y espero aprender de este esfuerzo.

Tengo un código funcionando que procesará uno o más archivos arrastrados a mi aplicación. El procesamiento toma un archivo ".mp4" y, usando VLC, reemplaza el códec de audio con otro códec creando un archivo con el mismo nombre pero con el sufijo ".m4v". Luego se elimina el archivo original ".mp4". Estos pasos funcionan bien.

Luego deseo renombrar el archivo recién creado con sufijo ".m4v" a ".mp4". Esto falla miserablemente. He buscado en Google y leído artículos. Obviamente no estoy entendiendo las sutilezas de POSIX, alias y file.

Estoy proporcionando una versión simplificada de la aplicación que obtiene los caminos y crea los nombres de archivo. Elimina el archivo ".mp4" pero falla al renombrar el archivo ".m4v".

La iteración actual del código falla con este error:

No se puede establecer el nombre del archivo "Volumen de Datos: The Gilded Age S02 E01.m4v" en "The Gilded Age S02 E01.mp4". Finder obtuvo un error: No se puede establecer el nombre del archivo "Volumen de Datos: The Gilded Age S02 E01.m4v" a "The Gilded Age S02 E01.mp4". (-10006)

Cualquier información para orientarme en la dirección correcta sería apreciada.

--##################################################################
--# Fragmento de muestra asumiendo:
--#  - El archivo "Volumen de Datos: The Gilded Age S02 E01.mp4" existe y se arrastra a esta aplicación
--#  - El archivo "mp4" es procesado creando "Volumen de Datos: The Gilded Age S02 E01.m4v"
--#  - El archivo "mp4" luego se elimina
--# - El archivo "m4v" es renombrado al archivo "mp4".   ESTO FALLA
--##################################################################

--############################################
--# este código procesa cada archivo arrastrado a esta aplicación
--############################################
on open theDroppedItems
    repeat with a from 1 to length of theDroppedItems
        set aDroppedItem to item a of theDroppedItems
        display dialog "main(): aDroppedItem = " & aDroppedItem

        set aDroppedItem_FullPath to the POSIX path of aDroppedItem
        display dialog "main(): aDroppedItem_FullPath = " & aDroppedItem_FullPath

        set aDroppedItem_FullPath_NoSfx to remove_file_suffix(aDroppedItem_FullPath)
        display dialog "main(): aDroppedItem_FullPath_NoSfx = " & aDroppedItem_FullPath_NoSfx

        set aDroppedItem_Filename to name of (info for aDroppedItem_FullPath) as string
        display dialog "main(): aDroppedItem_Filename = " & aDroppedItem_Filename

        set aNewFile_FullPath to aDroppedItem_FullPath_NoSfx & ".m4v" as string
        display dialog "main(): aNewFile_FullPath = " & aNewFile_FullPath

        set aNewFile to aNewFile_FullPath as POSIX file
        display dialog "main(): aNewFile = " & aNewFile

        -- delete the original "mp4" file
        display dialog "main(): delete aDroppedItem = " & aDroppedItem
        tell application "Finder"
            try
                move aDroppedItem to trash
            end try
        end tell

        -- rename the new "m4v" file to "mp4"
        display dialog "main(): rename aNewFile = " & aNewFile
        display dialog "main(): rename aDropped_Filename = " & aDroppedItem_Filename
        tell application "Finder"
            -- this fails
            set name of aNewFile to aDroppedItem_Filename
        end tell

    end repeat
end open

--############################################
--# esta subrutina elimina el sufijo del archivo
--############################################
on remove_file_suffix(theText)
    if length of theText = 0 then
        error "No se puede recortar el texto vacío." number -1728
    else if length of theText = 1 then
        return ""
    else
        return text 1 thru -5 of theText
    end if
end remove_file_suffix

2voto

red_menace Puntos 111

Parece que Finder no se lleva bien con la coerción de archivos POSIX, pero en realidad no se lleva bien con los archivos POSIX en general. Una solución fácil es también coercer el archivo POSIX a alias, por ejemplo:

set aNewFile to aNewFile_FullPath as POSIX file as alias

Cuando se trabaja con una mezcla de rutas POSIX y HFS/APFS, usar System Events suele ser más fácil, ya que puede manejar rutas de texto para ambos. Algunos comandos y propiedades pueden ser ligeramente diferentes, por ejemplo, la extensión del nombre en System Events es de solo lectura, pero en general es menos caprichoso:

on run -- ejemplo
   open (choose file with multiple selections allowed)
end run

on open droppedItems
   repeat with anItem in droppedItems
      set posixPath to the POSIX path of anItem
      set pathWithoutExt to removeFileExt(posixPath)
      tell application "System Events" to set filename to name of disk item posixPath
      set newFilePath to pathWithoutExt & ".m4v"
      display dialog "elemento original: " & (anItem as text) & return & return & "
posixPath = " & posixPath & "
pathWithoutExt = " & pathWithoutExt & "
filename = " & filename & "
newFilePath = " & newFilePath with title "Prueba "
      display dialog "Eliminar " & quoted form of posixPath & return & return & "Renombrar " & quoted form of newFilePath & " a " & quoted form of filename with title "Eliminar y Renombrar"
      tell application "System Events"
         move disk item posixPath to trash
         set name of disk item newFilePath to filename
      end tell
   end repeat
end open

on removeFileExt(filePath) -- eliminar cualquier extensión de archivo de la ruta
   set filePath to filePath as text
   tell application "System Events" to set extension to name extension of disk item filePath
   if extension is "" then return filePath
   return text 1 thru -((count extension) + 2) of filePath
end removeFileExt

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