"制作文件夹(如果不存在)"逻辑失败,但只是第一次运行

时间:2017-10-03 01:18:53

标签: macos file applescript directory finder

我在AppleScript中编写了一个小应用程序,我希望能够在~/Library/Application Support/com.example.appname/中为它存储一些文件。我写了一些逻辑来检查该文件夹是否存在,如果它不存在则创建它。 (我假设~/Library/Application Support/肯定已经存在。)这是我的代码:

tell application "Finder"
    set applicationSupport to (path to library folder from user domain as text) & "Application Support:"
    set configFolderName to "com.example.appname"
    if not (exists folder (applicationSupport & configFolderName & ":")) then
        make new folder at applicationSupport with properties {name:configFolderName}
    end if
    set configFolder to folder (applicationSupport & configFolderName & ":")
end tell

第一次运行时,创建文件夹,但它也不会在make new folder at...行崩溃。相反,它会在set configFolder to...行崩溃并显示消息:

  

错误" Finder收到错误:无法获取文件夹\" Macintosh HD:用户:hayden:库:应用程序支持:com.example.appname:\"。&#34 ;从文件夹" Macintosh HD编号为-1728:用户:hayden:库:应用程序支持:com.example.appname:"

但是,第二次运行它时,它会创建文件夹并完成执行而不会出现问题,甚至超过之前崩溃的行。如果我将display dialog (configFolder as text)添加到脚本的末尾,则会显示:

  

Macintosh HD:用户:hayden:Library:应用程序支持:com.example.appname:

在后续运行中,它也可以正常工作,并在对话框中显示相同的信息。

如果我删除了com.example.app目录(带有rm -d),它会重置它 - 它在第一次运行之后会失败(与上面相同的错误),但随后每次运行都会工作。

有没有人知道导致第一次运行失败的原因是什么导致第二次运行失败,我应该修改什么来修复它?

如果重要:我在Mac OS X 10.10.5上运行它,使用Script Editor.app测试它并将其保存为应用程序。

3 个答案:

答案 0 :(得分:0)

我仍然不确定发生了什么,但我能够通过使用POSIX路径(即/ - 分隔)而不是使用别名(即: - 分隔)来使其正常工作。这是我的新代码:

tell application "Finder"
    set applicationSupport to path to application support from user domain
    set configFolderName to "com.example.appname"
    set configFolderPath to (POSIX path of applicationSupport) & configFolderName & "/"
    if not (exists configFolderPath as POSIX file) then
        make new folder at applicationSupport with properties {name:configFolderName}
    end if
    set configFolder to folder configFolderName of applicationSupport
end tell

我认为关键问题可能是AppleScript真的不喜欢你创建一个文件夹/别名/文件来引用一些尚不存在的东西。但是,如果你有一个引用不存在的文件/文件夹的POSIX文件,它似乎并不在意。这个问题也可能与我使用path to ... from user domain构造来访问我的主文件夹这一事实有关,而不仅仅是将路径硬编码到/Users/username/...(这对于确保代码将是必要的)在任何机器上运行。)

我不认为这与此问题有关,但我改变的另一件事是我现在通过path to application support from user domain获取Application Support文件夹,而不是获取path to library from user domain并获取Application Support子文件夹。

答案 1 :(得分:0)

恕我直言,使用mkdir命令会更简单,当使用-p选项运行时,会使所需的所有目录都能获得你想要的东西。

因此,如果您想要一个名为$HOME/Desktop/Some/Long/Path/New的目录,您只需执行以下操作:

do shell script "mkdir -p $HOME/Desktop/Some/Long/Path/New"

答案 2 :(得分:-1)

set configFolderName to "com.example.appname"

tell application "System Events"
    if not folder configFolderName of application support folder exists then
        set configFolder to make new folder at application support folder ¬
            with properties {name:configFolderName}
    end if
end tell