Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos &引用;“如果不存在,则创建文件夹”;逻辑失败,但仅在第一次运行时_Macos_File_Applescript_Directory_Finder - Fatal编程技术网

Macos &引用;“如果不存在,则创建文件夹”;逻辑失败,但仅在第一次运行时

Macos &引用;“如果不存在,则创建文件夹”;逻辑失败,但仅在第一次运行时,macos,file,applescript,directory,finder,Macos,File,Applescript,Directory,Finder,我正在用AppleScript编写一个小应用程序,我希望能够将它的一些文件存储在~/Library/application Support/com.example.appname/中。我编写了一些逻辑来检查该文件夹是否存在,如果不存在,则创建它。(我假设~/Library/Application Support/肯定已经存在。)下面是我的代码: tell application "Finder" set applicationSupport to (path to library fol

我正在用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
第一次运行此命令时,它不会创建文件夹,但也不会在…行的
创建新文件夹时崩溃。相反,它会在
将configFolder设置为…
行崩溃,并显示以下消息:

错误“Finder出现错误:无法获取文件夹\”Macintosh HD:Users:hayden:Library:Application Support:com.example.appname:\”。文件夹“Macintosh HD:Users:hayden:Library:Application Support:com.example.appname:”中的编号-1728

但是,在您第二次运行它时,它会创建文件夹并完成执行,而不会出现问题,甚至会越过它以前崩溃的行。如果我在脚本末尾添加
显示对话框(将文件夹配置为文本)
,它将显示:

Macintosh HD:Users:hayden:Library:Application Support:com.example.appname:

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

如果我删除com.example.app目录(使用
rm-d
),它会重置此目录——之后我第一次运行它时它会失败(错误与上面相同),但随后每次运行都会失败

有人知道是什么导致第一次运行失败,是什么导致第二次运行没有失败,以及我应该改变什么来修复它吗


如果有问题的话:我正在Mac OS X 10.10.5上运行这个程序,使用Script Editor.app来测试它并将它保存为一个应用程序。

我仍然不确定到底发生了什么,但我能够通过使用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文件,则似乎不太在意。这个问题也可能与我正在使用
路径。。。从用户域
构造访问我的主文件夹,而不仅仅是硬编码路径到
/Users/username/…
(这是确保代码在任何计算机上运行所必需的)


我认为这与问题无关,但我改变的另一件事是,我现在通过从用户域到应用程序支持的
路径获得应用程序支持文件夹,而不是从用户域到库的
路径获得应用程序支持子文件夹。

这会简单得多,我想,只需使用
mkdir
命令,当与
-p
选项一起运行时,该命令会生成一路上所需的所有目录,以获取所需内容

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

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

不要按原样使用
.app
,将
设置configFolderName为“com.example.app”
更改为
将configFolderName设置为“com.example.appname”
,这样你就不会有问题了。@user3439894啊,哎呀,在为堆栈溢出选择示例名称时没有想到这一点(我现在已将其更改为“com.example.appname”)在问题中)。我的实际标识符是“io.schiff.subtitleedit.maclauncher”,很遗憾,这不是问题所在。如果我将问题中的代码复制并粘贴到脚本编辑器,它将创建目标,而不会在第一次运行时抛出致命错误。它确实会在第一行
set
上抛出一个非致命错误。实际上,我会在
告诉应用程序“Finder”
块之前设置前两行
set
,让前两行
set
当前应用程序下运行。如果我将答案中的代码复制粘贴到脚本编辑器中并运行,它会出错,所以在我看来,这不是一个有效的答案……我发现现在也发生了这种情况。我发誓,我确实测试过它,它正在工作——还有别的事情正在进行中。唉,我会继续努力,并根据我找到的内容更新/删除此答案。@user3439894我现在已将其更新为新的解决方案,并且我已对该解决方案重新测试了5次,所以我肯定它是好的!:)是的,那可能会更容易,但我真的很想正确地学习AppleScript并以“正确的方式”做事。这是在一个我正在分发给其他人的应用程序中进行的,所以我也有点担心经常通过shell传递东西可能带来的安全隐患。