POSIX pathのフルパスの文字列(quoteなし)を与えると、そのファイルを実際に作成した場合に指定のパスに同名のファイルが存在するかどうか重複検出を行い、重複するものがあった場合には重複回避してファイル名を返すAppleScriptです。
# 一部ミスがあるものを掲載していたので、書き換えておきました
ファイルの新規保存を行う際に、安全に新しい名称を指定できるよう、重複検出および重複回避を行います。
デスクトップ上に、
test.jpg
test_1.jpg
というファイルがあった場合に、本Scriptで「test.jpg」を指定すると、同じ名前のファイルがデスクトップに存在するものと判定されて、名称の衝突回避を行います。
回避するためにファイル名の末尾に「_」+番号を付けて回避を行いますが、すでに「test_1.jpg」が存在するために、本Scriptではさらに名称回避を行なって「test_2.jpg」の文字列を返します。
子番号については、1〜65535の範囲で追加するようにしています。常識的にこれだけ指定しておけば大丈夫だろう、ということであってとくに上限に意味はありません。
AppleScript名:POSIX path stringを与えると、ファイル名の重複を検出&名称回避を行って、ファイル名のみを返す v2 |
— Created 2020-08-15 by Takaaki Naganoya — 2015-2020 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" property NSString : a reference to current application’s NSString property NSFileManager : a reference to current application’s NSFileManager property NSOrderedSame : a reference to current application’s NSOrderedSame set newPath to POSIX path of (choose file name) set ab to chkExistPOSIXpathAndIncrementChildNumber(newPath) of me –POSIX path stringを与えると、ファイル名の重複を検出して、ファイル名の名称回避を行って、ファイル名のみを返す on chkExistPOSIXpathAndIncrementChildNumber(aPOSIX as string) set aStr to NSString’s stringWithString:aPOSIX –ファイルパス(フルパス)からファイル名部分を取得 set bStr to aStr’s lastPathComponent() –> "P0000_000.csv" –ファイル名から拡張子を取得 set cStr to (bStr’s pathExtension()) as string –> "csv" –ファイル名から拡張子を削除 set dStr to (bStr’s stringByDeletingPathExtension()) as string –> "P0000_000" –ファイルパス(フルパス)から親フォルダを取得(ただし末尾はスラッシュになっていない) set eStr to (aStr’s stringByDeletingLastPathComponent()) as string –> "/Users/me/Desktop" set aManager to NSFileManager’s defaultManager() set aRes to (aManager’s fileExistsAtPath:aStr) as boolean if aRes = false then –ファイル名の衝突がなかった場合 return bStr as string end if set hitF to false repeat with i from 1 to 65535 set tmpPath to (eStr & "/" & dStr & "_" & (i as string) & "." & cStr) set tmpStr to (NSString’s stringWithString:tmpPath) set aRes to (aManager’s fileExistsAtPath:tmpStr) as boolean set bRes to ((tmpStr’s caseInsensitiveCompare:eStr) is not equal to (NSOrderedSame)) as boolean if {aRes, bRes} = {false, true} then set hitF to true exit repeat end if end repeat if hitF = false then return false –ファイルパス(フルパス)からファイル名部分を取得 set returnFileName to tmpStr’s lastPathComponent() return (returnFileName as string) end chkExistPOSIXpathAndIncrementChildNumber |