2008-09-28 4 views
17

मैं एक प्रोग्राम लिख रहा हूं (मैक ओएस एक्स के लिए, उद्देश्य-सी का उपयोग करके) और मुझे प्रोग्रामेटिक रूप से .webloc फ़ाइलों का एक समूह बनाने की आवश्यकता है।क्राफ्टिंग .webloc फ़ाइल

.webloc फ़ाइल केवल फ़ाइल है जो आपके द्वारा सफारी के स्थान पट्टी से कुछ फ़ोल्डर में खींचने के बाद बनाई गई है।

आम तौर पर, मुझे एक फाइल सिस्टम में आइटम बनाने के लिए एक दृष्टिकोण की आवश्यकता है जो वेब में कुछ स्थान को इंगित करता है। जैसा कि मैं समझता हूं। मैक ओएस एक्स

पर इस के लिए .webloc फ़ाइलों का उपयोग किया जाना चाहिए, तो क्या एक .webloc फ़ाइल को वैध यूआरएल और इसके लिए कुछ शीर्षक बनाना संभव है?

उत्तर

21

यह बहुत कम ज्ञात नहीं है - लेकिन वेबलॉक्स के लिए एक साधारण प्लिस्ट आधारित फ़ाइल प्रारूप भी है।

वेबलोक फ़ाइलों को बनाते समय आपको की आवश्यकता नहीं है ताकि उन्हें संसाधन विधि का उपयोग करके अन्य तीन पोस्टर का वर्णन किया जा सके। तुम भी एक सरल plist लिख सकते हैं:

?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>URL</key> 
    <string>http://apple.com</string> 
</dict> 
</plist> 

द्विआधारी संसाधन प्रारूप सक्रिय उपयोग में अब भी है और आप एक plist फ़ाइल पढ़ना चाहते हैं - तो सुनिश्चित करें कि आप दोनों फ़ाइल स्वरूपों पढ़ने की जरूरत है। लेकिन फ़ाइल लिखते समय - प्लेस्ट आधारित प्रारूप का उपयोग करें - यह बहुत आसान है।

+1

क्या कोई सफारी के साथ केवल डेटा फोर्क कार्यों के साथ वेबलोक फ़ाइल की पुष्टि कर सकता है? मैंने श्वा के उदाहरण एक्सएमएल प्लिस्ट को वेबलोक फ़ाइल के रूप में सहेजने की कोशिश की लेकिन इसे सफारी में खींचते समय यह एक खाली विंडो खुलता है। मैंने फ़ायरफ़ॉक्स के साथ एक वेबलोक फ़ाइल सहेजने का भी प्रयास किया। दिलचस्प बात यह है कि फ़ायरफ़ॉक्स एक डेटा फोर्क (एसएमए के उदाहरण में एक्सएमएल प्लिस्ट) और एक संसाधन कांटा दोनों के साथ एक फाइल लिखता है। उस फ़ाइल को सफारी कार्यों में खींचें। लेकिन जब मैंने संसाधन कांटा को हटाने की कोशिश की (इसे खाली धारा के साथ कमांड लाइन पर ओवरराइट करके) यह अब काम नहीं करता है। सफारी 4.0.5 और फ़ायरफ़ॉक्स 3.6.3 का उपयोग कर परीक्षण किया गया। – Rinzwind

+3

मेरी पिछली टिप्पणी के लिए और स्पष्टीकरण: मैंने इसे खोलने के लिए फ़ाइल को डबल क्लिक करने की कोशिश नहीं की थी। मैंने अभी किया है और वह डेटा-कांटा-केवल वेबलोक फ़ाइल के साथ काम करता है, जो सफारी में यूआरएल खोलता है। लेकिन जैसा कि मैंने उपरोक्त कहा है, सफारी में वेबलोक फ़ाइल को ड्रग करना काम नहीं करता है, यह एक खाली खिड़की लाता है। (साथ ही, फ़ाइल को एक सफारी बुकमार्क विंडो में खींचकर वेबलोक फ़ाइल में निहित यूआरएल के लिए बुकमार्क के बजाय वेबलोक फ़ाइल के लिए // // URL के साथ एक बुकमार्क बनाता है।) – Rinzwind

1

यह संसाधन फोर्क-आधारित बाइनरी प्रारूप का उपयोग करता है।

मान्य समाधान:

  • उपयोगकर्ता अपने आवेदन (NSURLPboardType) खोजक करने के लिए में से किसी URL को खींच लो। खोजक आपके लिए एक वेबलॉक बनाएगा।
  • विंडोज वेब शॉर्टकट (.URL फ़ाइल) बनाएँ। इन्हें आईएनआई-जैसे डेटा फोर्क-आधारित प्रारूप है और इसे इंटरनेट पर कहीं भी दस्तावेज किया जाना चाहिए; ओएस उन्हें समर्थन देता है क्योंकि यह वेबलॉक्स का समर्थन करता है।
6

.webloc फ़ाइल में इसके डेटा कांटा में कुछ भी नहीं है; इसके बजाए, यह यूआरएल को संग्रहीत करता है जो इसे संसाधन संसाधन के रूप में संदर्भित करता है। आप DeRez(1) उपकरण का उपयोग कमांड लाइन पर यह देख सकते

यहाँ मैं यह एक .webloc फ़ाइल है कि मैं इस प्रश्न के लिए मेरी सफारी पता पट्टी से बाहर निकाल लिया पर हुई:

% DeRez "Desktop/Crafting .webloc file - Stack Overflow.webloc" 
data 'drag' (128, "Crafting .webloc file -#1701953") { 
    $"0000 0001 0000 0000 0000 0000 0000 0003"   /* ................ */ 
    $"5445 5854 0000 0100 0000 0000 0000 0000"   /* TEXT............ */ 
    $"7572 6C20 0000 0100 0000 0000 0000 0000"   /* url ............ */ 
    $"7572 6C6E 0000 0100 0000 0000 0000 0000"   /* urln............ */ 
}; 

data 'url ' (256, "Crafting .webloc file -#1701953") { 
    $"6874 7470 3A2F 2F73 7461 636B 6F76 6572"   /* http://stackover */ 
    $"666C 6F77 2E63 6F6D 2F71 7565 7374 696F"   /* flow.com/questio */ 
    $"6E73 2F31 3436 3537 352F 6372 6166 7469"   /* ns/146575/crafti */ 
    $"6E67 2D77 6562 6C6F 632D 6669 6C65"     /* ng-webloc-file */ 
}; 

data 'TEXT' (256, "Crafting .webloc file -#1701953") { 
    $"6874 7470 3A2F 2F73 7461 636B 6F76 6572"   /* http://stackover */ 
    $"666C 6F77 2E63 6F6D 2F71 7565 7374 696F"   /* flow.com/questio */ 
    $"6E73 2F31 3436 3537 352F 6372 6166 7469"   /* ns/146575/crafti */ 
    $"6E67 2D77 6562 6C6F 632D 6669 6C65"     /* ng-webloc-file */ 
}; 

data 'urln' (256, "Crafting .webloc file -#1701953") { 
    $"4372 6166 7469 6E67 202E 7765 626C 6F63"   /* Crafting .webloc */ 
    $"2066 696C 6520 2D20 5374 6163 6B20 4F76"   /* file - Stack Ov */ 
    $"6572 666C 6F77"          /* erflow */ 
}; 

केवल संसाधन है कि शायद 'url ' और 'TEXT' आईडी 256 के संसाधनों में होने की आवश्यकता है, और शायद उन्हें संसाधन नामों की आवश्यकता नहीं है। 'urln' संसाधन आसान हो सकता है यदि आप दस्तावेज़ के शीर्षक को यूआरएल पॉइंट्स भी शामिल करना चाहते हैं। 'drag' संसाधन सिस्टम को बताता है कि यह एक क्लिपिंग फ़ाइल है, लेकिन मुझे इस बात की अनिश्चितता है कि इस दिन और उम्र में यह होना चाहिए या नहीं।

संसाधनों और फ़ाइल के संसाधन कांटा के साथ काम करने के लिए, आप संसाधन प्रबंधक का उपयोग करते हैं - कार्बन के अंतर्निहित टुकड़ों में से एक जो मूल मैक पर वापस जाता है। हालांकि, संसाधन प्रबंधक के लिए कुछ कोको रैपर हैं, जैसे कि Nathan Day's NDResourceFork

+1

सफारी और TextEdit के साथ अपने परीक्षण में, ' 'की जरूरत है drag'' वहाँ हो। संसाधन नामों को नजरअंदाज कर दिया जाता है; एक NSTextView से एक लिंक खींचने से उन्हें उत्पादन नहीं होता है। –

7

.webloc फ़ाइलें (अधिक सामान्य रूप से, इंटरनेट स्थान फ़ाइलें) एक प्रारूप में लिखी जाती हैं जिनकी परिभाषा मैक ओएस 8.x पर वापस जाती है। यह संसाधन-आधारित है, जो क्लिपिंग प्रारूप से प्राप्त होता है जब आप टेक्स्ट या छवियों जैसे ड्रैग किए गए ऑब्जेक्ट्स से फ़ाइल बनाते हैं।

लिखा गया संसाधन 'url ' 256 और 'TEXT' 256 है, जो यूआरएल को संग्रहीत करता है, और वैकल्पिक रूप से 'urln' 256, जिसमें यूआरएल से जुड़े पाठ होते हैं। 'drag' अन्य दो (या तीन) संसाधनों के लिए 128 अंक।

Cocoatech Open Source framework कोकोटेकफाउंडेशन (बीएसडी लाइसेंस प्राप्त) का हिस्सा NTWeblocFile, उद्देश्य-सी से इन फ़ाइलों को लिखने का समर्थन करता है। यदि आप URL पर अलग-अलग शीर्षक निर्दिष्ट करना चाहते हैं, तो आपको कक्षा को संशोधित करने की आवश्यकता होगी ताकि यह 'urln' संसाधन में यूआरएल के अलावा कुछ और लिख सके।

मैक ओएस एक्स 10 में।3 और बाद में, यूआरएल फ़ाइल के डेटा कांटा में एक संपत्ति सूची में भी लिखा जा सकता है (लिखा जा सकता है)। यह कैसे काम करता है इसके लिए अन्य उत्तर देखें ...

+0

प्लिस्ट प्रारूप 10.3 के बाद से रहा है - यह _is_ पूरी तरह से समर्थित है। खोजक में एक बनाएं और डबल क्लिक करें और इसे सफारी (या जो कुछ भी) में फेंडर द्वारा खोला जाएगा। प्लिस्ट वेबलोक बनाने का एक शानदार तरीका उदाहरण के लिए BBEdit से URL को ड्रैगइन करें। – schwa

+0

(किसी भी कारण से मैंने अपने परीक्षणों के दौरान अमान्य plists का उत्पादन किया। आप सही हैं, यह काम करता है।) –

2

"वेब शॉर्टकट" बनाने का एक और तरीका पहले से उल्लिखित .url फ़ाइल है।

[InternetShortcut] 
URL=http://www.apple.com/ 

नोट फ़ाइल 3 लाइनों है, अंतिम पंक्ति रिक्त है:
सामग्री की तरह (plist XML- आधारित की तुलना में काफी सरल) देखो।

More info on .url file format

+2

दुर्भाग्यवश, उनको सफारी द्वारा संभाला जाता है, नहीं प्रणाली। इसका अर्थ यह है कि सफारी फ़ाइल में यूआरएल को संभालने का प्रयास करेगी, भले ही सफारी उस यूआरएल की योजना के लिए डिफ़ॉल्ट ऐप है या फिर वह उस योजना को संभालने में सक्षम हो। –

0

यह किसी भी तीसरे पक्ष के पुस्तकालयों की जरूरत के बिना मूल कार्य करता है,। (चेतावनी दी रहें: कम से कम त्रुटि जाँच।)

// data for 'drag' resource (it's always the same) 
#define DRAG_DATA_LENGTH 64 
static const unsigned char _dragData[DRAG_DATA_LENGTH]={ 
    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 
    0x54, 0x45, 0x58, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x75, 0x72, 0x6C, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x75, 0x72, 0x6C, 0x6E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 

static void _addData(NSData *data, ResType type, short resId, ResFileRefNum refNum) 
{ 
    Handle handle; 
    if (PtrToHand([data bytes], &handle, [data length])==noErr) { 
     ResFileRefNum previousRefNum=CurResFile(); 
     UseResFile(refNum); 

     HLock(handle); 
     AddResource(handle, type, resId, "\p"); 
     HUnlock(handle); 

     UseResFile(previousRefNum); 
    } 
} 

void WeblocCreateFile(NSString *location, NSString *name, NSURL *fileUrl) 
{ 
    NSString *contents=[NSString stringWithFormat: 
         @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" 
         @"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" 
         @"<plist version=\"1.0\">\n" 
         @"<dict>\n" 
         @"<key>URL</key>\n" 
         @"<string>%@</string>\n" 
         @"</dict>\n" 
         @"</plist>\n", location]; 

    if ([[contents dataUsingEncoding:NSUTF8StringEncoding] writeToURL:fileUrl options:NSDataWritingAtomic error:nil]) 
    {   
     // split into parent and filename parts 
     NSString *parentPath=[[fileUrl URLByDeletingLastPathComponent] path]; 
     NSString *fileName=[fileUrl lastPathComponent]; 

     FSRef parentRef; 
     if(FSPathMakeRef((const UInt8 *)[parentPath fileSystemRepresentation], &parentRef, NULL)==noErr) 
     { 
      unichar fileNameBuffer[[fileName length]]; 
      [fileName getCharacters:fileNameBuffer]; 

      FSCreateResFile(&parentRef, [fileName length], fileNameBuffer, 0, NULL, NULL, NULL); 
      if (ResError()==noErr) 
      { 
       FSRef fileRef; 
       if(FSPathMakeRef((const UInt8 *)[[fileUrl path] fileSystemRepresentation], &fileRef, NULL)==noErr) 
       { 
        ResFileRefNum resFileReference = FSOpenResFile(&fileRef, fsWrPerm); 
        if (resFileReference>0 && ResError()==noErr) 
        { 
         _addData([NSData dataWithBytes:_dragData length:DRAG_DATA_LENGTH], 'drag', 128, resFileReference); 
         _addData([location dataUsingEncoding:NSUTF8StringEncoding], 'url ', 256, resFileReference); 
         _addData([location dataUsingEncoding:NSUTF8StringEncoding], 'TEXT', 256, resFileReference); 
         _addData([name dataUsingEncoding:NSUTF8StringEncoding], 'urln', 256, resFileReference); 
         CloseResFile(resFileReference); 
        } 
       } 
      } 
     } 
    } 
} 
+1

सिर्फ nsdictionary आपके लिए plist करने के लिए बहुत आसान है। \t \t एनएसएमयूटेबल डिक्शनरी * dict = [एनएसएमयूटेबल डिक्शनरी विथ कैपेसिटी: 1]; \t \t [dict setObject: @ "http: //" forKey: @ "URL"]; \t \t [dict writeToFile: @ "/ file" परमाणु रूप से: नहीं]; – bigkm