NSURLからbookmarkDataを作成、あるいはbookmarkDataからNSURLを復元する実験を行うAppleScriptです。
POSIX pathのファイルパスをplistに保存するような場合に、元のファイルの場所が変わったり名前が変わったりすると、追跡できなくなってしまいます。
「aliasをpropertyに保存していた時代には、自動で追跡してもらえたんだけどなー」
そのため、plistからPOSIX pathを取り出したあとは逐一「本当にそのパスにファイルが存在するか」をチェックしていたのですが、
「もっといいものがあるよ」
と教えていただいたのが、このbookmarkDataです。
NSURL(filePathのほう)をbookmarkDataにすると、元のファイルの名前が変わったり場所(パス)が変わったりしても追跡してくれます。ファイルのノード番号をベースに追跡しているのでしょうか。とにかく、追跡してもらえるのはいいことです。
本AppleScriptでは、POSIX pathをNSURLを経由してboookmarkDataに変換し、オリジナルのファイルをリネームして、bookmarkDataからNSURL–> POSIX pathを取得。得られたパスがリネーム後のものと同じかどうかをチェックするものです。
テストを行った範囲では、想定どおりに使えているようです。
AppleScript名:POSIX path–>Bookmark & bookmark –> POSIX path.scptd |
— – Created by: Takaaki Naganoya – Created on: 2018/10/02 — – Copyright © 2018 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions property |NSURL| : a reference to current application’s |NSURL| property NSString : a reference to current application’s NSString property NSFileManager : a reference to current application’s NSFileManager property NSURLBookmarkResolutionWithoutUI : a reference to current application’s NSURLBookmarkResolutionWithoutUI set aFile to POSIX path of (choose file) –> "/Users/me/Desktop/9E37BC8B-3920-4844-A6D1-0DCA183D744D.png" –POSIX path –> URL –> Bookmark set aURL to |NSURL|’s fileURLWithPath:aFile set aBookmarkData to aURL’s bookmarkDataWithOptions:0 includingResourceValuesForKeys:(missing value) relativeToURL:(missing value) |error|:(missing value) –Rename Original File set fRes to renameFileItem(aFile, "test_test_test") of me if fRes = false then error "Error: File already exists." –Bookmark –> URL –> POSIX path set bURL to |NSURL|’s URLByResolvingBookmarkData:aBookmarkData options:(NSURLBookmarkResolutionWithoutUI) relativeToURL:(missing value) bookmarkDataIsStale:(missing value) |error|:(missing value) set bPath to (bURL’s |path|()) as string –> "/Users/me/Desktop/test_test_test.png" –File Rename Routine on renameFileItem(aPOSIX, newName) set theNSFileManager to NSFileManager’s defaultManager() set POSIXPathNSString to NSString’s stringWithString:(aPOSIX) –Make New File Path set anExtension to POSIXPathNSString’s pathExtension() set newPath to (POSIXPathNSString’s stringByDeletingLastPathComponent()’s stringByAppendingPathComponent:newName)’s stringByAppendingPathExtension:anExtension –Rename if theNSFileManager’s fileExistsAtPath:newPath then return false else set theResult to theNSFileManager’s moveItemAtPath:POSIXPathNSString toPath:newPath |error|:(missing value) if (theResult as integer = 1) then return (newPath as string) else return false end if end if end renameFileItem |