ปัญหา:. itmsp โฟลเดอร์จะแสดงเป็นไฟล์
Finder ปฏิบัติต่อโฟลเดอร์. itmsp เป็นแพ็คเกจนั่นคือราวกับว่าเป็นไฟล์เดียว ตัวอย่างเช่นในมุมมองคอลัมน์สิ่งใดก็ตามที่อยู่ในโฟลเดอร์. itmsp จะมองไม่เห็นมีเพียงไอคอนเอกสารเท่านั้นที่แสดง:
Finder พิจารณาว่าไดเร็กทอรีเป็นแพ็กเกจหากเงื่อนไขใด ๆ ต่อไปนี้เป็นจริง (จากคู่มือการเขียนโปรแกรม Bundle ):
ไดเรกทอรีที่มีส่วนขยายของแฟ้มที่รู้จักกัน (ตามที่กำหนดใน .app, .bundle, .framework, .plugin, .kext และอื่น ๆ/System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
. นี้เป็น plist ไบนารีเปิดกับ Xcode: open -a Xcode Info.plist
)
ไดเรกทอรีมีส่วนขยายที่บางแอปพลิเคชันอ้างสิทธิ์แทนประเภทแพคเกจ (ค้นหาcom.apple.package
ผลลัพธ์จากmdls -name kMDItemContentTypeTree <foldername>
การค้นหา)
ไดเรกทอรีมีชุดบิตของแพคเกจ (หากGetFileInfo -ab <foldername>
ส่งคืน1
จะถูกตั้งค่าไว้)
กรณีที่ 2. ใช้กับโฟลเดอร์. itmsp: Application Loader.app
ประเภทการส่งออกcom.apple.itunes-producer.itmsp
และตั้งค่าให้สอดคล้องกับcom.apple.package
:
$ mkdir foo.itmsp
$ mdls -name kMDItemContentTypeTree foo.itmsp/
kMDItemContentTypeTree = (
"com.apple.itunes-producer.itmsp",
"com.apple.package",
(...)
)
$ grep -B 5 -A 8 com.apple.package /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Info.plist
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>com.apple.package</string>
<string>public.composite-content</string>
</array>
<key>UTTypeDescription</key>
<string>iTunes Package</string>
<key>UTTypeIconFile</key>
<string>ITMSP.icns</string>
<key>UTTypeIdentifier</key>
<string>com.apple.itunes-producer.itmsp</string>
วิธีการแก้ปัญหา: ประกาศอีกครั้งประเภท com.apple.itunes-producer.itmsp
วิธีแก้ปัญหาคือประกาศประเภทcom.apple.itunes-producer.itmsp
และนามสกุลใหม่itmsp
เป็นโฟลเดอร์และบังคับให้บริการเปิดใช้งานเพื่อใช้การประกาศประเภทที่แก้ไข
โน๊ตสำคัญ:
แม้ว่ามันจะแก้ปัญหาของ OP ได้อย่างน่าเชื่อถือ แต่โซลูชันที่นำเสนอเมื่อนำไปใช้กับแพ็คเกจอื่น ๆ ไม่ได้แสดงเป็นโฟลเดอร์
ฉันพบว่าโซลูชันที่เสนอนั้นดูเหมือนว่าจะทำงานกับประเภทไฟล์ที่ประกาศโดยแอปพลิเคชันที่อยู่ในพา ธ แอปพลิเคชันที่ไม่เป็นมาตรฐานเท่านั้น
นี้เป็นกรณีที่มีที่ตั้งอยู่ในApplication Loader.app
/Applications/Xcode.app/Contents/Applications/
หากคุณมีความสนใจในการแก้ปัญหาบางส่วนตรวจสอบจุดสิ้นสุดของคำตอบนี้
หากต้องการให้โฟลเดอร์. itmsp แสดงเป็นโฟลเดอร์โดย Finder ให้ทำตามขั้นตอนถัดไป:
เปิด Automator ในโฟลเดอร์ Applications และเลือกApplication :
เลือกโปรแกรมอรรถประโยชน์ในรายการไลบรารีเลือกเรียกใช้ Shell Script และลากไปยังบานหน้าต่างด้านขวา:
แทนที่เนื้อหาสคริปต์เริ่มต้นด้วยexit 0
:
บันทึกแอปพลิเคชันเป็น itmspOpener:
ปิด Automator
เลือกitmspOpener.app
และแสดงเนื้อหา:
ค้นหาเนื้อหา> Info.plist และเปิดด้วยเครื่องมือแก้ไขที่คุณชื่นชอบ:
แทนที่ส่วนเหล่านี้ในInfo.plist
:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>itmsp</string>
</array>
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleTypeIconFile</key>
<string>folder</string>
<key>LSTypeIsPackage</key>
<false/>
<key>LSHandlerRank</key>
<string>Owner</string>
</dict>
</array>
(...)
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>kUTTypeDirectory</string>
</array>
<key>UTTypeDescription</key>
<string>itmsp folder</string>
<key>UTTypeIconFile</key>
<string>folder.icns</string>
<key>UTTypeIdentifier</key>
<string>com.apple.itunes-producer.itmsp</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>itmsp</string>
</dict>
</dict>
</array>
หมายเหตุ:
ทำไมkUTTypeDirectory
แทนpublic.directory
ในUTExportedTypeDeclarations
? จากเอกสารของ Apple : สำคัญ: เมื่อใช้ UTIs ที่ระบบกำหนดในรหัสของคุณคุณควรใช้ค่าคงที่ที่กำหนดในUTCoreTypes.h
เฟรมเวิร์ก Launch Services เมื่อพร้อมใช้งานแทนที่จะใช้สตริง UTI จริง ตัวอย่างเช่นส่งผ่าน kUTTypeApplication แทนที่จะเป็น "com.apple.application" “ ตัวระบุประเภทเครื่องแบบแบบระบบประกาศ” แสดงรายการค่าคงที่เหล่านี้เพิ่มเติมจากสตริง UTI
เชื่อมโยงไฟล์. itmsp กับitmspOpener
และกดปุ่มChange All...:
รีเซ็ตฐานข้อมูล Launch Services:
$ lsregister -kill -r -domain local -domain system -domain user
(บน OS X 10.8 lsregister
ตั้งอยู่/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/
)
สร้างโฟลเดอร์. itmsp และแสดงรายการคุณสมบัติ:
$ mkdir foo3.itmsp
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.folder",
"public.directory",
"public.item"
)
เนื่องจากฐานข้อมูล Launch Services ถูกรีเซ็ตตอนนี้ Finder จะแสดงโฟลเดอร์. itmsp เป็นโฟลเดอร์
เปิดitmspOpener.app
เพื่อโหลดไฟล์ plist และลงทะเบียนcom.apple.itunes-producer.itmsp
:
$ open ~/Desktop/itmspOpener.app
เริ่มApplication Loader.app
:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
โฟลเดอร์foo3.itmsp
ควรจะยังคงแสดงเป็นโฟลเดอร์
ตรวจสอบคุณสมบัติของโฟลเดอร์อีกครั้ง:
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.directory",
"public.item",
"public.content"
)
com.apple.package
ไม่ได้ถูกเพิ่มไปยังแอตทริบิวต์ข้อมูลเมตาของโฟลเดอร์นั่นคือสาเหตุที่ Finder ยังคงแสดงโฟลเดอร์. itmsp เป็นโฟลเดอร์!
โซลูชันอัตโนมัติ: แสดงโฟลเดอร์. itmsp เป็นโฟลเดอร์หลังจากเข้าสู่ระบบ
ในการแสดงโฟลเดอร์. itmsp เป็นโฟลเดอร์หลังจากเข้าสู่ระบบ:
สร้างitmspOpener.app
และแก้ไขInfo.plist
ตามที่อธิบายไว้ข้างต้น
สร้าง/usr/local/bin/itmspTypeLoader
ด้วยเนื้อหานี้ (ตัวแปรitmspOpener
ชี้ไปที่ตำแหน่งที่itmspOpener.app
อยู่เปลี่ยนตามความจำเป็น):
#!/bin/bash
itmspOpener="/Users/jaume/Applications/itmspOpener.app/"
echo "$(date): Starting" > /tmp/itmspTypeLoader.log
sleep 15
echo "$(date): Deleting Launch Services database" >> /tmp/itmspTypeLoader.log
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain system -domain user >> /tmp/itmspTypeLoader.log
sleep 15
echo "$(date): Starting $itmspOpener" >> /tmp/itmspTypeLoader.log
open $itmspOpener >> /tmp/itmspTypeLoader.log
sleep 1
echo "$(date): Starting Application Loader.app" >> /tmp/itmspTypeLoader.log
open "/Applications/Xcode.app/Contents/Applications/Application Loader.app/"
# Wait until process "Application Loader.app" exists
while [ $(ps -ef|grep -v grep|grep -c "Application Loader") -ne 1 ]; do
sleep 1
echo "$(date): Waiting" >> /tmp/itmspTypeLoader.log
done
# Send TERM signal
kill -TERM $(ps -ef|grep "Application Loader"|grep -v grep|awk "{print \$2}")
if [ $? -eq 0 ]; then
echo "$(date): Application Loader killed" >> /tmp/itmspTypeLoader.log
else
echo "$(date): Application Loader could not be killed" >> /tmp/itmspTypeLoader.log
fi
echo "$(date): Exiting" >> /tmp/itmspTypeLoader.log
ทั้งsleep 15
ก่อนและหลังการวิ่งlsregister
มีความสำคัญสูงสุด หากคุณไม่เห็นผลลัพธ์ที่ต้องการลองความล่าช้าที่แตกต่างกัน
สร้าง/usr/local/bin/itmspTypeLoaderLauncher
ด้วยเนื้อหานี้:
#!/bin/bash
# $1 returns the short name of the user who is logging in
su - $1 -c /usr/local/bin/itmspTypeLoader &
ตั้งค่าสคริปต์ทั้งสองให้ทำงานได้:
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
ตั้ง/usr/local/bin/itmspTypeLoaderLauncher
เป็นเบ็ดเข้าสู่ระบบ :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
รีบูตเพื่อให้การเปลี่ยนแปลงมีผล หลังจากเข้าสู่ระบบคุณจะเห็นสิ่งนี้:
และlsregister -dump
ควรเปิดเผยว่าitmspOpener.app
มีUTExportedTypeDeclarations
ความสำคัญกว่าApplication Loader.app
:
$ lsregister -dump | less
bundle id: 24748
path: /Users/jaume/Desktop/itmspOpener.app/
name: itmspOpener
(...)
flags: apple-internal relative-icon-path ui-element has-min-sys-version-by-arch hi-res-capable user-can-change-hi-res-mode
item flags: container package application extension-hidden native-app scriptable services x86_64
(...)
--------------------------------------------------------
type id: 33796
uti: com.apple.itunes-producer.itmsp
description: itmsp folder
flags: exported active apple-internal trusted
icon: Contents/Resources/folder.icns
conforms to: kuttypedirectory
tags: .itmsp
--------------------------------------------------------
(...)
bundle id: 24600
path: /Applications/Xcode.app/Contents/Applications/Application Loader.app/
name: Application Loader
(...)
flags: apple-internal relative-icon-path hi-res-capable user-can-change-hi-res-mode
item flags: container package application extension-hidden native-app i386 x86_64
(...)
--------------------------------------------------------
type id: 33832
uti: com.apple.itunes-producer.itmsp
description: iTunes Package
flags: exported inactive apple-internal trusted
icon: Contents/Resources/ITMSP.icns
conforms to: com.apple.package, public.composite-content
tags: .itmsp
--------------------------------------------------------
คุณเห็นการinactive
ตั้งค่าสถานะในการส่งออกชนิดของ Application Loader.app หรือไม่ เราพ่ายแพ้ Application Loader
การทดสอบกรด:. itmsp โฟลเดอร์ยังคงแสดงเช่นนี้หลังจากการปรับปรุง iTunes
ฉันเพิ่งอัปเดต Xcode:
และสามารถยืนยันได้ว่าโฟลเดอร์. itmsp ถูกแสดงเป็นโฟลเดอร์ในระหว่างการอัพเดท:
และหลังจากนั้น:
โซลูชันบางส่วน: แพ็คเกจจะแสดงเนื้อหาเมื่อดับเบิลคลิก
ตามที่แสดงความคิดเห็นก่อนหน้านี้ขั้นตอนรายละเอียดด้านบนจะไม่ทำงานกับโฟลเดอร์ที่กำหนดเองซึ่งแสดงเป็นแพ็คเกจโดย Finder
อย่างไรก็ตามหากคุณต้องการให้คลิกสองครั้งที่แพคเกจเพื่อเปิดมันมีวิธีที่จะทำมันด้วยหนึ่งbash
สคริปต์และ Automator:
สคริปต์จะสร้างโฟลเดอร์ชั่วคราวที่ซ่อนอยู่ภายในแพ็คเกจแสดงใน Finder (ซึ่งจะแสดงให้เห็นว่าเป็นแพคเกจโฟลเดอร์) จากนั้นลบโฟลเดอร์ชั่วคราว
บันทึก:
สคริปต์สามารถสร้างไฟล์ชั่วคราวที่ซ่อนอยู่แทน อย่างไรก็ตามฉันต้องการสร้างโฟลเดอร์เพราะrmdir
จะลบเฉพาะโฟลเดอร์เปล่าในขณะที่rm
ลบไฟล์ใด ๆดังนั้นถ้าด้วยเหตุผลบางประการ สคริปต์สร้างความเสียหายเฉพาะโฟลเดอร์ที่ว่างเปล่าเท่านั้นที่จะถูกลบซึ่งอาจไม่เลวเท่าที่ลบไฟล์
Automator รวมสคริปต์เข้าไปในแอปพลิเคชันที่จะเชื่อมโยงกับไฟล์แพ็กเกจ
เหล่านี้เป็นขั้นตอนในการสร้างแอปพลิเคชันดังกล่าว ฉันจะใช้ไฟล์. itmsp เป็นตัวอย่างประเภทแพ็คเกจในคำอธิบายด้านล่าง:
เปิด Automator ในโฟลเดอร์ Applications และเลือกApplication :
เลือกโปรแกรมอรรถประโยชน์ในรายการไลบรารีเลือกเรียกใช้ Shell Scriptและลากไปยังบานหน้าต่างด้านขวา:
ตั้งค่าการป้อนข้อมูลผ่านไปเป็นข้อโต้แย้ง :
แทนที่เนื้อหาสคริปต์เริ่มต้นด้วยสิ่งนี้:
for f in "$@"; do
# If not dealing with a directory, exit
if [ ! -d "$f" ]; then exit; fi
# Create a temporary directory inside the itmsp "file"
tmpdir="$f/.itmspOpener$$"
if mkdir $tmpdir; then
# Reveal in Finder
open -R $tmpdir
# Delete temporary file
rmdir $tmpdir
fi
done
บันทึกแอปพลิเคชันเป็น itmspOpener:
ปิด Automator
ตอนนี้คุณมีแอปพลิเคชั่นที่สามารถเปิดไฟล์. itmsp เป็นโฟลเดอร์หากเชื่อมโยงกับมัน
มีปัญหาเกี่ยวกับเครื่องสำอางเนื่องจากไฟล์ที่เกี่ยวข้องจะมีไอคอนเอกสารสีขาวมาตรฐาน:
มาแก้ไขกันเถอะ:
ตรวจสอบให้แน่ใจว่าปิดอัตโนมัติแล้ว
เลือก itmspOpener และแสดงเนื้อหา:
ค้นหาเนื้อหา> Info.plist และเปิดด้วยเครื่องมือแก้ไขที่คุณชื่นชอบ:
แทนที่ค่าสำหรับคีย์นี้ในCFBundleDocumentTypes
อาร์เรย์:
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
และเพิ่มคีย์นี้:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
ตอนนี้หัวข้อจะเป็นดังนี้:
สลับไปที่ Finder เลือกโฟลเดอร์กด⌘Iเลือกไอคอนโฟลเดอร์ที่มุมบนซ้ายและคัดลอกด้วย⌘C:
เปิดดูตัวอย่างและเลือกไฟล์> ใหม่จากคลิปบอร์ด บันทึกไฟล์เป็นfolder.icns
:
คัดลอกfolder.icns
ไปที่itmspOpener/Contents/Resources
:
เชื่อมโยงไฟล์. itmsp กับitmspOpener
และกดปุ่มChange All...:
ไอคอนของไฟล์. itmsp ควรเปลี่ยนเป็นโฟลเดอร์หรืออย่างน้อยฉันก็คิดอย่างนั้นโชคไม่ดีในกรณีนี้ ดังนั้นฉันจึงย้ายแอปพลิเคชัน itmspOpener ไปยังตำแหน่งอื่น (ฉันสร้างโฟลเดอร์ชั่วคราวบนเดสก์ท็อปของฉันย้ายไปที่นั่นแล้วกลับไปที่เดสก์ท็อปของฉัน) ที่รีเฟรชข้อมูลไอคอนใน Finder:
ตอนนี้ดับเบิลคลิกที่ไฟล์. itmsp และเปิดดูเป็นโฟลเดอร์: