2015-04-01 5 views
1

Из-за моей слегка навязчивой индивидуальности я терял большую часть своего продуктивного времени до одной маленькой проблемы.AppleScript: «файл уже открыт», но «файл не был открыт»

Недавно я перешел с Mac OS X Tiger на Yosemite (да, это довольно большой скачок). Я не думал, что AppleScript сильно изменился, но я столкнулся с проблемой, которую я не помню в прежние времена. Я имел следующий код, но с действительным FilePath:

set my_filepath to (* replace with string of POSIX filepath, because typing 
          colons was too much work *) 
    set my_file to open for access POSIX file my_filepath with write permission 

Остальная часть кода была ошибка, которую я разрешенное довольно легко, но из-за ошибки остановил сценарий перед командой close access, и конечно AppleScript осталось ссылка на файл открыта. Поэтому, когда я снова попытался запустить скрипт, мне сообщили о синтаксической ошибке: файл уже открыт. Этого следовало ожидать.

У меня возникла проблема с попыткой закрыть ссылку: независимо от того, что я сделал, я получил сообщение об ошибке, заявив, что файл не был открыт. Я пробовал close access POSIX file (* filepath string again *), close access file (* whatever that AppleScript filepath format is called *), и так далее. В конце концов я решил проблему, перезагрузив компьютер, но это не совсем элегантное решение. Если никакое другое решение не представится, то так оно и есть; однако по интеллектуальным и практическим причинам меня не устраивает перезагрузка, чтобы закрыть доступ. Кто-нибудь знает о этой проблеме?

Я подозреваю, что упустил из виду нечто очевидное.


Редактировать: Подождите, нет, мой переключатель не был напрямую от Tiger; У меня была промежуточная стадия в Snow Leopard, но тогда я не делал много сценариев. Я понятия не имею, насколько это актуально.

+0

Альтернативой перезапуску редактора сценариев является покупка отладчика сценариев, который, я считаю, позволит вам закрыть «пропущенные» обработчики файлов после предоставления вам предупреждения. Моя версия 4.5 (устаревшая) делает это как минимум. – McUsr

ответ

0

Согласен, что перезапуск, вероятно, является самым простым решением. Еще одна идея, хотя это утилита unix «lsof», чтобы получить список всех открытых файлов. Он возвращает довольно большой список, поэтому вы можете комбинировать его с «grep», чтобы отфильтровать его для вас. Так что в следующий раз попробовать это из терминала и посмотреть, если вы получаете результат ...

lsof +fg | grep -i 'filename' 

Если вы получаете результат вы получите идентификатор процесса (PID), и вы могли бы потенциально убить/остановить процесс, который открыв файл и тем самым закройте файл. Я никогда не пробовал это для этой ситуации, но это могло бы сработать.

У вас когда-либо был пустой мусор, поскольку он говорит, что файл открыт? Именно тогда я использую этот подход, и он работает большую часть времени. Я действительно сделал приложение под названием What's Keeping Me (found here), чтобы помочь людям с этой проблемой и использует этот код в качестве основы для приложения. Возможно, он тоже будет работать в этой ситуации.

Удачи.

+0

Это делает работа. Благодарю. –

+0

Если это ответили на ваш вопрос, отметьте его как ответ, проверив его. Это позволяет другим знать, что вам помогли. – regulus6633

+0

Не могу поверить, как долго я искал эту галочку. –

Смежные вопросы