2010-01-05 11 views
10

टर्मिनल के माध्यम से बंडल आप एक आदेश के साथ कर सकते हैं - "SetFile -एक बी फ़ाइल नाम"मेकअप मैक पैकेज/प्रोग्राम के रूप में

प्रोग्राम के रूप में मुझे लगता है कि मैं के माध्यम से [[NSFileManager defaultManager] createDirectoryAtPath विशेषताओं में से एक स्थापित करना चाहिए: dirPath इंटरमीडिएट डायरेक्टरीज़: कोई विशेषता नहीं: विशेषताएं त्रुटि: शून्य];

लेकिन मुझे कौन सा नहीं मिल रहा है।

धन्यवाद

उत्तर

12

यह अभी भी उपयोगी है कि बंडल बिट प्रोग्रामेटिक रूप से सेट करने में सक्षम हो, उदाहरण के लिए iPhoto iPhoto लाइब्रेरी फ़ोल्डर को एक फ़ाइल के रूप में दिखाई देने के लिए करता है।

आप कार्बन फ़ाइल प्रबंधक API का उपयोग करके प्रोग्राम को बंडल बिट सेट कर सकते हैं। आपको यह सुनिश्चित करना होगा कि आपका ऐप कार्बन ढांचे के खिलाफ लिंक करता है और <Carbon/Carbon.h> हेडर आयात करता है। ये कॉल 64-बिट सुरक्षित हैं।

- (void)setBundleBitOfFile:(NSString*)path toBool:(BOOL)newValue 
{ 
    const char* pathFSR = [path fileSystemRepresentation]; 
    FSRef ref; 
    OSStatus err  = FSPathMakeRef((const UInt8*)pathFSR, &ref, /*isDirectory*/ NULL); 

    if (err == noErr) 
    { 
     struct FSCatalogInfo catInfo; 
     union FinderInfoTransmuter finderInfoPointers = { .bytes = catInfo.finderInfo }; 

     err = FSGetCatalogInfo(&ref, 
           kFSCatInfoFinderInfo, 
           &catInfo, 
           /*outName*/ NULL, 
           /*FSSpec*/ NULL, 
           /*parentRef*/ NULL); 

     if (err == noErr) 
     { 
      if (newValue) 
       finderInfoPointers.finderInfo->finderFlags |= kHasBundle; 
      else 
       finderInfoPointers.finderInfo->finderFlags &= ~kHasBundle; 

      FSSetCatalogInfo(&ref, 
          kFSCatInfoFinderInfo, 
          &catInfo); 
     } 
    } 
} 

- (BOOL)bundleBitOfFile:(NSString*)path 
{ 
    BOOL value   = NO; 

    const char* pathFSR = [path fileSystemRepresentation]; 
    FSRef ref; 
    OSStatus err  = FSPathMakeRef((const UInt8*)pathFSR, &ref, /*isDirectory*/ NULL); 

    if (err == noErr) 
    { 
     struct FSCatalogInfo catInfo; 
     union FinderInfoTransmuter finderInfoPointers = { .bytes = catInfo.finderInfo }; 

     err = FSGetCatalogInfo(&ref, 
           kFSCatInfoFinderInfo, 
           &catInfo, 
           /*outName*/ NULL, 
           /*FSSpec*/ NULL, 
           /*parentRef*/ NULL); 

     if (err == noErr) 
     { 
      value = (BOOL)(((finderInfoPointers.finderInfo->finderFlags) & kHasBundle) == kHasBundle); 
     } 
    } 

    return value; 
} 
4

आप क्या करने की कोशिश कर रहे हैं?

लगभग सभी मैक ओएस एक्स बंडल वास्तव में फ़ाइलों/फ़ोल्डरों के एक बहुत ही विशिष्ट लेआउट के साथ फ़ोल्डर होते हैं। शायद ही कभी एक फ़ाइल है एक बंडल - वे मौजूद हैं, लेकिन अक्सर नहीं।

ज्यादातर मामलों में, फ़ाइल पर बंडल बिट पूरी तरह से अप्रासंगिक है।

i want to set a folder as a bundle. so through the file system it will looks like a file. later a want to open that package with my application. the question is how to set the folder bundle attribute through cocoa.

आपको वास्तव में बंडल बिट सेट करने की आवश्यकता नहीं है। जब तक आपके फ़ोल्डर में एक एक्सटेंशन (जिसे यह करना चाहिए) और आपका एप्लिकेशन उस एक्सटेंशन के फ़ाइलों/फ़ोल्डरों को खोलने के लिए ठीक से कॉन्फ़िगर किया गया है, तो यह खोजक में बोया जाना चाहिए जैसे कि यह एक फ़ाइल थी।

उदाहरण:

  1. जाओ खोजक

  2. टर्मिनल में ~/डेस्कटॉप के लिए, कार्य करें:

  3. cd ~/Desktop

  4. mkdir aafoo

  5. mv aafoo aafoo.rtfd

के बाद (4), आप 'aafoo' फ़ोल्डर के रूप में खोजक में प्रदर्शित दिखाई देगा।

आफ्टर (5), 'aafoo' टेक्स्टएडिट दस्तावेज़ में बदल जाएगा। कोई विशेषता बिट्स आवश्यक है।


ठीक है - काफी उचित है। आप वास्तव में वास्तव में उस बिट को सेट करना चाहते हैं।

यह देखते हुए कि आपके पास यह करने के लिए कमांड लाइन है, मैं बस NSTask का उपयोग करने का सुझाव दूंगा। ऐसा करने के लिए एपीआई का उपयोग करने की संभावना अधिक आसान होगी।

+0

मैं एक फ़ोल्डर को बंडल के रूप में सेट करना चाहता हूं। तो फाइल सिस्टम के माध्यम से यह एक फाइल की तरह दिखता है। बाद में मैं अपने पैकेज के साथ उस पैकेज को खोलना चाहता हूं। प्रश्न यह है कि कोको के माध्यम से फ़ोल्डर बंडल विशेषता को कैसे सेट करें। – Remizorrr

+0

हां। लेकिन मुझे विस्तार से आरटीएफडी की आवश्यकता नहीं है। लेकिन उदाहरण के लिए एफबीपी। और मुझे इसे प्रोग्रामेटिक रूप से बनाने की आवश्यकता है। किसी फ़ोल्डर को बंडल बनाने के लिए आप टर्मिनल के माध्यम से कमांड का उपयोग कर सकते हैं: SetFile -a B फ़ोल्डर नाम। सेटफाइल के लिए मैन पेज कहता है - -a विशेषताएँ फ़ाइल विशेषताएँ बिट्स सेट करती है ... (आदि) बी | बी बंडल है। प्रश्न यह है कि कोको के माध्यम से समान प्रोग्रामेटिक तरीके से कैसे बनाया जाए। – Remizorrr

4

आप एक बंडल विशेषता सेट नहीं करते हैं। आप अपने दस्तावेज़ के प्रकार को अपने आवेदन की जानकारी में परिभाषित करते हैं।प्लेलिस्ट फ़ाइल, और यह वह जगह है जहां आप निर्दिष्ट करते हैं कि आपके दस्तावेज़ पैकेज या सादे फाइलें हैं या नहीं।

आप अपने आवेदन लक्ष्य पर "जानकारी प्राप्त करें" चुनकर एक्सकोड के भीतर ऐसा कर सकते हैं; "गुण" टैब पर स्विच करें, फिर "दस्तावेज़ प्रकार" के अंतर्गत एक दस्तावेज़ जोड़ें, इसे एक नाम दें, अपना फ़ाइल एक्सटेंशन सेट करें, एक आइकन फ़ाइल चुनें, फिर "पैकेज" चेकमार्क देखें।

+0

बेशक, इस काम के लिए आपको यह सुनिश्चित करने की ज़रूरत है कि आपके दस्तावेज एक बंडल संरचना के साथ सहेजे गए हैं, जैसा कि यहां उल्लिखित है: http://developer.apple.com/mac/library/documentation/CoreFoundation/Conceptual/CFBundles/DocumentPackages/DocumentPackages .html # // apple_ref/doc/uid/10000123i-CH106-SW1 –

+0

इसमें कोई चाल नहीं है। लेख उद्धृत करने के लिए: "आपको बस इतना करना है कि उचित फ़ाइल नाम एक्सटेंशन के साथ एक निर्देशिका बनाएं।" – Darren

+0

हां, आप सही हैं। –

2

मदद के लिए सभी को धन्यवाद। मैंने info.plist फ़ाइल के साथ समाधान का उपयोग किया। यह प्लेलिस्ट फ़ाइल का हिस्सा है।

<key>CFBundleDocumentTypes</key> 
<array> 
    <dict> 
     <key>CFBundleTypeName</key> 
     <string>Project</string> 
     <key>LSHandlerRank</key> 
     <string>Default</string> 
     <key>LSTypeIsPackage</key> 
     <true/> 
     <key>CFBundleTypeExtensions</key> 
     <array> 
      <string>fbp</string> 
     </array> 
     <key>CFBundleTypeIconFile</key> 
     <string>document</string> 
     <key>CFBundleTypeRole</key> 
     <string>Editor</string> 
    </dict> 
</array> 
संबंधित मुद्दे