समस्या: .itmsp फ़ोल्डर को फ़ाइलों के रूप में दिखाया गया है
खोजक .itmsp फ़ोल्डर को पैकेज के रूप में मानता है, जैसे कि वे एक ही फाइल थे। उदाहरण के लिए, स्तंभ दृश्य में, .itmsp फ़ोल्डर में मौजूद कुछ भी अदृश्य है, केवल दस्तावेज़ आइकन दिखाया गया है:
खोजक एक निर्देशिका को एक पैकेज मानता है यदि निम्न में से कोई भी स्थिति सत्य है ( बंडल प्रोग्रामिंग गाइड से ):
निर्देशिका में एक ज्ञात फ़ाइल नाम एक्सटेंशन है: .app, .bundle, .framework, .plugin, .kext, और इतने पर (जैसा कि परिभाषित किया गया है /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.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
महत्वपूर्ण लेख:
हालाँकि यह ओपी की समस्या को हल करता है, प्रस्तावित समाधान, जब अन्य पैकेजों पर लागू होता है, तो उन्हें फ़ोल्डर्स के रूप में प्रदर्शित नहीं किया जाता है।
मुझे पता चला है कि प्रस्तावित समाधान केवल गैर-मानक एप्लिकेशन पथ में स्थित अनुप्रयोगों द्वारा घोषित फ़ाइल प्रकारों के साथ काम करता है।
यह मामला है Application Loader.app
, जो में स्थित है /Applications/Xcode.app/Contents/Applications/
।
यदि आप एक आंशिक समाधान में रुचि रखते हैं, तो इस उत्तर के अंत की जांच करें।
खोजक द्वारा .itmsp फ़ोल्डरों को फ़ोल्डर्स के रूप में प्रदर्शित किया जाता है, अगले चरणों का पालन करें:
एप्लिकेशन फ़ोल्डर में ऑटोमेटर खोलें और एप्लिकेशन चुनें :
लाइब्रेरी सूची में उपयोगिताओं का चयन करें, शैल स्क्रिप्ट का चयन करें और इसे दाईं ओर फलक पर खींचें:
डिफ़ॉल्ट स्क्रिप्ट सामग्री को इसके साथ बदलें exit 0
:
एप्लिकेशन को itmspOpener के रूप में सहेजें:
स्वचालित बंद करें।
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
? से एप्पल के प्रलेखन : महत्वपूर्ण: अपने कोड में सिस्टम-निर्धारित यूटीआई उपयोग करते समय, आप स्थिरांक में परिभाषित का प्रयोग करना चाहिए UTCoreTypes.h
लॉन्च सेवाएं ढांचे में उपलब्ध होने पर, के बजाय वास्तविक यूटीआई तार। उदाहरण के लिए, "com.apple.application" के बजाय kUTTypeApplication पास करें। “सिस्टम-डिक्लेयर यूनिफ़ॉर्म टाइप आइडेंटिफ़ायर” यूटीआई स्ट्रिंग्स के अलावा इन स्थिरांक को सूचीबद्ध करता है।
एक .itmsp फ़ाइल को संबद्ध करें itmspOpener
और बटन दबाएं Change All...:
लॉन्च सेवा डेटाबेस रीसेट करें:
$ 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"
)
क्योंकि लॉन्च सेवाएँ डेटाबेस रीसेट हो गया था, अब फाइंडर फ़ोल्डर के रूप में .itmsp फ़ोल्डर्स को दिखाता है।
itmspOpener.app
अपनी फ़ाइल को लोड करने के लिए खोलें और रजिस्टर करें 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
फ़ोल्डर के मेटाडेटा विशेषताओं में नहीं जोड़ा गया, इसीलिए फ़ाइंडर अभी भी .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
एप्लिकेशन लोडर .app के निर्यात में ध्वज सेट दिखाई देता है ? हमने एप्लिकेशन लोडर को हराया।
एसिड परीक्षण:। Itmsp फ़ोल्डर्स अभी भी iTunes अपडेट के बाद प्रदर्शित होते हैं
मैंने हाल ही में Xcode अपडेट किया है:
और पुष्टि कर सकते हैं कि .itmsp फ़ोल्डर्स को अपडेट के दौरान फ़ोल्डर्स के रूप में दिखाया गया था:
और उसके बाद:
एक आंशिक समाधान: पैकेज डबल क्लिक होने पर सामग्री दिखाएगा
जैसा कि पहले कहा गया था, ऊपर दी गई प्रक्रिया मनमाने ढंग से फ़ोल्डरों के साथ काम नहीं करेगी जो फाइंडर द्वारा पैकेज के रूप में प्रदर्शित की जाती हैं।
हालाँकि, यदि आप इसे खोलने के लिए किसी पैकेज को डबल-क्लिक करना चाहते हैं, तो इसे एक bash
स्क्रिप्ट और ऑटोमेटर के साथ करने का एक तरीका है :
स्क्रिप्ट पैकेज के अंदर एक छिपा हुआ, अस्थायी फ़ोल्डर बनाता है, इसे फाइंडर में प्रकट करता है (इस प्रकार पैकेज को फ़ोल्डर के रूप में प्रकट करता है) और फिर अस्थायी फ़ोल्डर को हटा देता है।
ध्यान दें:
इसके बजाय स्क्रिप्ट एक छिपी, अस्थायी फ़ाइल बना सकती है। हालांकि, मैं एक फ़ोल्डर बनाना पसंद करता हूं क्योंकि किसी भी फ़ाइल को हटाते समय rmdir
केवल खाली फ़ोल्डर rm
हटाता है , इसलिए यदि, किसी कारण से। स्क्रिप्ट कहर ढाती है, केवल खाली फ़ोल्डर हटा दिए जाएंगे, जो शायद उतना बुरा नहीं है जितना कि फाइलें हटा दी गईं।
ऑटोमेकर स्क्रिप्ट को एक एप्लिकेशन में बंडल करता है जो पैकेज फ़ाइलों के साथ जुड़ा होगा।
ये ऐसे एप्लिकेशन बनाने के चरण हैं। मैं नीचे दिए स्पष्टीकरण में पैकेज प्रकार के उदाहरण के रूप में .itmsp फ़ाइलों का उपयोग करूंगा:
एप्लिकेशन फ़ोल्डर में ऑटोमेटर खोलें और एप्लिकेशन चुनें :
लाइब्रेरी सूची में उपयोगिताओं का चयन करें , शैल स्क्रिप्ट का चयन करें और इसे दाईं ओर फलक पर खींचें:
पास इनपुट को तर्क के रूप में सेट करें :
इसके साथ डिफ़ॉल्ट स्क्रिप्ट सामग्री बदलें:
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 के रूप में सहेजें:
स्वचालित बंद करें।
अब आपके पास एक एप्लिकेशन है जो .itmsp फ़ाइलों को फ़ोल्डर के रूप में खोल सकता है यदि इसके साथ जुड़ा हुआ है।
एक कॉस्मेटिक समस्या है: जैसा कि यह खड़ा है, संबंधित फाइलों में मानक सफेद दस्तावेज़ आइकन होगा:
चलो इसे भी ठीक करें:
सुनिश्चित करें कि ऑटोमेटर बंद है।
ItmspOpener चुनें और इसकी सामग्री दिखाएँ:
सामग्री का पता लगाएँ> Info.plist और अपने पसंदीदा संपादक के साथ खोलें:
इस कुंजी के मान को CFBundleDocumentTypes
सरणी में बदलें :
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
और इस कुंजी को जोड़ें:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
अब, अनुभाग इस तरह दिखता है:
खोजक पर स्विच करें, एक फ़ोल्डर चुनें, प्रेस करें ⌘I, बाएं शीर्ष कोने में फ़ोल्डर आइकन का चयन करें और इसे इसके साथ कॉपी करें ⌘C:
पूर्वावलोकन खोलें और क्लिपबोर्ड से फ़ाइल> नया चुनें। फ़ाइल को इस रूप में सहेजें folder.icns
:
इसे कॉपी folder.icns
करें itmspOpener/Contents/Resources
:
एक .itmsp फ़ाइल को संबद्ध करें itmspOpener
और बटन दबाएं Change All...:
.Itmsp फ़ाइलों के आइकन को एक फ़ोल्डर में बदलना चाहिए, या कम से कम मैंने ऐसा सोचा: दुर्भाग्य से, यह मामला नहीं था। इसलिए मैंने एप्लिकेशन को किसी अन्य स्थान पर itmspOpener स्थानांतरित कर दिया (मैंने अपने डेस्कटॉप पर एक अस्थायी फ़ोल्डर बनाया, इसे वहां और मेरे डेस्कटॉप पर वापस भेज दिया)। इस खोजक में आइकन जानकारी को ताज़ा किया:
अब एक .itmsp फ़ाइल पर डबल क्लिक करें और इसे एक फ़ोल्डर के रूप में खुला देखें: