Ограничение длины имени файла для AppleScript в сценарии доступа к URL? - PullRequest
0 голосов
/ 09 августа 2010

У меня странная проблема с AppleScript, и я не могу понять причину или решение.Я пытаюсь загрузить файлы с помощью процесса, который имитирует приведенный ниже.Этот код не работает для меня, сообщая: « Сценарии доступа к URL получили ошибку: не удается преобразовать некоторые данные в ожидаемый тип».число от -1700 до элемента"

Если я удаляю 3 символа из локального пути (и кажется, что не имеет значения, какие 3), то он работает нормально. Если я удаляю только 2 символа,он не выдает ошибку, но загружаемый файл является поврежденным JPG. Я попытался сделать то же самое с помощью curl в строке «do shell script», и он, похоже, тоже не удался при любой длине имени файла, хотя и без вывода сообщений""). Что вызывает это, и что я могу с этим поделать?

tell application "URL Access Scripting"
    download "http://interfacelift.com/wallpaper_beta/grab/02331_veiledinclouds_2560x1600.jpg" to "/Users/abc/Downloads/02331_veiledinclouds_2560x1600.jpg"
end tell

Ответы [ 3 ]

1 голос
/ 10 августа 2010

Готов поспорить, что эта функция все еще вызывает древний вызов API Carbon (или pre-Carbon), который допускает только 31 символ.Некоторые ссылки Google, относящиеся к этому, относятся к 2003 году, и, что касается Mac OS, год и конкретный предел в 31 символ указывают на то, что это устаревший API, который никогда не обновлялся.Это проблема с темными углами Applescript.Может быть, Satimage или кто-то сделал дополнение для сценариев, которое работает вокруг этого.Я думаю, что вы застряли и вам нужна помощь где-то за пределами этого дополнения.Я хотел бы доказать, что это не так, потому что я не мог заставить его работать независимо от того, что я пытался.

1 голос
/ 10 августа 2010

В итоге я решил загрузить временное, более короткое имя, а затем переименовать его с помощью Finder.Переписанный скрипт приведен ниже:

tell application "URL Access Scripting"
    set tempFileName to "abc.jpg"
    set downloadPath to (POSIX path of (path to downloads folder))

    set tempFile to download "http://interfacelift.com/wallpaper_beta/grab/02331_veiledinclouds_2560x1600.jpg" to downloadPath & tempFileName
end tell

tell application "Finder" to set name of file tempFile to "02331_veiledinclouds_2560x1600.jpg"

Я предпочитаю простоту этого подхода подходу regulus6633, который переименовывает файл, только если он ему нужен.

1 голос
/ 10 августа 2010

Ваша самая большая проблема в том, что вы используете путь в стиле posix (используя косую черту), когда вы должны использовать путь в стиле mac (с двоеточиями). Applescript использует пути, разделенные двоеточиями. Мы можем конвертировать между ними, используя «путь posix» для перехода от двоеточия к косой черте и «файл posix» для перехода от косой черты к двоеточию.

И вы не можете просто передать путь в виде строки. В яблочном скрипте мы используем спецификаторы файлов ... именно поэтому я поставил слово file перед путем к строке. Так что это работает, как только мы это исправим.

set posixPath to "/Users/abc/Downloads/02331_veiledinclouds_2560x1600.jpg"
set macPath to (POSIX file posixPath) as text

tell application "URL Access Scripting"
    download "http://interfacelift.com/wallpaper_beta/grab/02331_veiledinclouds_2560x1600.jpg" to file macPath
end tell

Однако должна быть проблема с длиной имени файла, потому что при запуске его имя файла загруженного файла сокращается до 31 символа.

EDIT : Вот скрипт для усечения, загрузки и переименования файла при необходимости.

set posixPath to "/Users/abc/Downloads/02331_veiledinclouds_2560x1600.jpg"
set baseName to do shell script "/usr/bin/basename " & quoted form of posixPath

set needsRenaming to false
if (count of baseName) is greater than 31 then
    set downloadName to text -31 thru -1 of baseName
    set basePath to do shell script "/usr/bin/dirname " & quoted form of posixPath
    set posixPath to basePath & "/" & downloadName
    set needsRenaming to true
end if

set macPath to (POSIX file posixPath) as text

tell application "URL Access Scripting"
    download "http://interfacelift.com/wallpaper_beta/grab/02331_veiledinclouds_2560x1600.jpg" to file macPath
end tell

if needsRenaming then
    tell application "Finder"
        set name of file macPath to baseName
    end tell
end if
...