जबकि मैं व्यक्तिगत रूप से अवमानना में NSFileWrapper का डिज़ाइन रखता हूं, यदि आपको केवल प्रत्येक अनुलग्नक के डेटा की आवश्यकता है तो आप NSFileWrapper की regularFileContents
विधि के माध्यम से इसे एनएसडीएटी इंस्टेंस के रूप में एक्सेस कर सकते हैं। हालांकि, मुझे अपने आवेदन के लिए अनुलग्नक के लिए एक वैध और स्पष्ट पथनाम की आवश्यकता थी।
आप अपने NSTextView उपवर्ग और NSDraggingDestination प्रोटोकॉल विधि draggingEntered:
ओवरराइड और आप खींच आपरेशन के दौरान NSPasteboardItem वस्तुओं आपके आवेदन के लिए पारित पार कर सकते हैं कर सकते हैं: यह बहुत ज्यादा काम की तुलना में यह होना चाहिए प्राप्त करने के लिए। मैंने पथनाम और उसके इनोड नंबर को एनएसएमयूटेबल डिक्शनरी में रखना चुना है, क्योंकि NSFileWrapper आपको संदर्भित फ़ाइल के इनोड प्रदान कर सकता है। बाद में, जब मैं NSAextributedString के माध्यम से NSTextView सामग्री तक पहुंचता हूं, तो मैं इंडेक्स के रूप में इनोड का उपयोग करके अनुलग्नक का पथनाम प्राप्त कर सकता हूं। मेरी समाधान, कि मेरे आवेदन को प्रभावित नहीं करता साथ
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
// get pasteboard from dragging operation
NSPasteboard *pasteboard = [sender draggingPasteboard];
NSArray *pasteboardItems = [pasteboard pasteboardItems];
for (NSPasteboardItem *pasteboardItem in pasteboardItems) {
// look for a file url type from the pasteboard item
NSString *draggedURLString = [pasteboardItem stringForType:@"public.file-url"];
if (draggedURLString != nil) {
NSURL *draggedURL = [NSURL URLWithString:draggedURLString];
NSString *draggedPath = [draggedURL path];
NSLog(@"pathname: %@", draggedPath);
// do something with the path
// get file attributes
NSDictionary *draggedAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:draggedPath error:nil];
if (draggedAttributes == nil)
continue;
// the NSFileWrapper allows access to the absolute file via NSFileSystemFileNumber
// put the path and the inode (returned as an NSNumber) into a NSMutableDictionary
NSNumber *draggedInode = [draggedAttributes objectForKey:NSFileSystemFileNumber];
[draggedFiles setObject:draggedPath forKey:draggedInode];
}
}
return [super draggingEntered:sender];
}
एक मुद्दा यह है कि एक से अधिक फ़ाइलों को देखने में घसीटा (या तो अकेले या एक साथ) जो एक ही फाइल करने के लिए हार्ड लिंक कर रहे हैं, केवल के रूप में सूचीबद्ध हो जाएगा अंतिम पथनाम शब्दकोश में जोड़ा गया जो इनोड साझा करता है। आपके आवेदन द्वारा पथनामों का उपयोग कैसे किया जाता है इस पर निर्भर करता है कि यह एक मुद्दा हो सकता है।
दुर्भाग्यवश NSFileWrapper द्वारा लौटाए गए विशेषता शब्दकोश पूर्ण पथनाम प्रदान नहीं करते हैं। NSFileWrapper का डिज़ाइन मूल संदर्भ ऑब्जेक्ट के पथनाम तक पहुंच प्रदान करने के लिए अस्वीकार करके मायोपिक और दुर्भाग्यपूर्ण encapsulation मान्यताओं बनाता है। – ctpenrose