Ограничение длины имени файла для AppleScript в сценариях доступа к URL?

У меня странная проблема с 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

person Dov    schedule 09.08.2010    source источник


Ответы (3)


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

person Philip Regan    schedule 10.08.2010
comment
Если подумать об этом подробнее, то очень странным является эффект, который я заметил, когда длина составляет 33 символа вместо 32 или 34 (включая период и расширение). В 32 все нормально, а в 34 вообще не дает - а в 33 сохраняет, но портит. Странно, и я действительно понятия не имею, что это означает или подразумевает. - person Dov; 10.08.2010
comment
Я думаю, это просто означает, что вы наткнулись на то, что тогда было ошибкой, а сейчас это просто устаревшая функциональность. - person Philip Regan; 10.08.2010
comment
Есть ли лучший способ скачать файл? Насколько я мог судить, это был самый простой и рекомендуемый способ (без автоматизации FTP-приложения). - person Dov; 11.08.2010
comment
В прошлый раз, когда мне приходилось это делать, я написал небольшое приложение с поддержкой Applescript в Real Studio, чтобы помочь мне с загрузкой. Я не рекомендую это здесь, но я готов поспорить, что есть команда оболочки или сценарий, который можно получить откуда-то. У меня не так много практических знаний о Терминале, но из того, что я могу собрать, почти все, что вы можете придумать, там есть. Команды оболочки могут быть включены в Applescript с помощью команды do shell script. - person Philip Regan; 11.08.2010

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

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

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 символа.

РЕДАКТИРОВАТЬ: Вот сценарий для усечения, загрузки и переименования файла, если это необходимо.

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
person regulus6633    schedule 09.08.2010
comment
Я получаю сообщение об ошибке, говорящее мне, что он не может получить файл POSIX по указанному пути (потому что файл еще не существует?). Я считаю, что сценарии доступа к URL-адресам действительно используют пути POSIX, поскольку многочисленные примеры, которые я нашел в Интернете, показывают это. Кроме того, я считаю, что это тонкая оболочка вокруг CURL - есть ли у CURL ограничение в 31 символ? Но спасибо за предложение. - person Dov; 10.08.2010
comment
Я могу поместить эти первые 2 строки в скрипт сами по себе, и ошибки не будет... и нет файла. Так что я не уверен, что происходит на вашей стороне. Убедитесь, что вы приводите его к тексту, как я показал, а затем в операторе загрузки вы помещаете файл с ключевым словом перед ним, чтобы привести его к спецификации файла, которая требуется оператору. - person regulus6633; 11.08.2010
comment
Хорошо, попробовав это снова, я вижу, что это работает, но с проблемой усечения, с которой вы обновили пост, мне не лучше. По сути, это усекает имя файла, а не выдает ошибку. - person Dov; 11.08.2010
comment
Я добавил в свой ответ еще один скрипт, который решает проблему усечения. По сути, он определяет, слишком ли длинное имя, и, если это так, вручную усекает имя, загружает файл и переименовывает усеченное имя в исходное имя. - person regulus6633; 12.08.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, который переименовывает файл только в случае необходимости.

person Dov    schedule 10.08.2010
comment
Отлично сработано. Я даже не думал этого делать. - person Philip Regan; 10.08.2010