objective c - How can I get the common ancestor directory for two or more files in Cocoa/Obj-C? -


मेरे पास फ़ाइलों का एक गुच्छा है, या तो NSString s या NSURL एस (यह कोई फर्क नहीं पड़ता, वे ज्यादातर भाग के लिए, विनिमेय हैं), और मुझे सामान्य पूर्वज निर्देशिका को खोजने का एक तरीका चाहिए क्या किसी को यह कैसे करना है?

मैं शपथ ले सकता था कि एक pathByJoiningPathComponents विधि कहीं, या कम से कम एक यह पसंद है, लेकिन मुझे कुछ और सोचना चाहिए यह पथ के लिए चाल है, यह यूआरएल के लिए भी काम कर सकता है यदि आप 10.6 पर हैं (मैं इसे केवल पथ के साथ परीक्षण किया है):

  NSString * path1 = @ "/ path / to / file1" ।टेक्स्ट"; NSString * path2 = @ "/ path / to / file / number2.txt"; NSArray * path1Comps = [पथ 1 पथसंचार]; NSArray * path2Comps = [path2 pathComponents]; NSUInteger कुल = [पथ 1 कॉम्प्स गिनती]; यदि ([path2coms गिनती] कुल <कुल = [path2comps गिनती];]; // दो NSUInteger i से छोटा हो; के लिए (i = 0; i & lt; कुल; i ++) यदि (! [[पथ 1 कॉम्प्स ऑब्जेक्टऐटीइंडएक्स: आई] एवलटोस्ट्रिंग: [पथ 2 सेकंड्स ऑब्जेक्टअटइंडएक्स: आई]]) ब्रेक; NSArray * commonComps = [पथ 1 कॉम्प्स सबरेरेविड्थ रेंज: एनएसएमकेरेंज (0, आई)]; // समान स्ट्रिंग के रूप में पथ पाने के लिए आम कॉम्प्स जोड़ता है  

मुझे नहीं लगता कि वहाँ एक & ldquo; built-in & rdquo; दुर्भाग्य से ऐसा करने का तरीका।

यदि आपके पास फ़ाइल पथ की एक सरणी है जिसे आप सामान्य पूर्वज खोजना चाहते हैं, तो आप ऐसा कुछ कर सकते हैं:

  NSArray * Allpaths = [NSArray arrayWithObjects: @ "/ path / to / 1.txt", @ "/ path / to / number / 2.txt", @ "/ path / to / number / 3 / file.txt", शून्य] ; // कुछ चेक यहां डालकर सुनिश्चित करें कि सरणी में पर्याप्त पथ हैं I NSArray * currentCommonComps = [[सभी लेख ऑब्जेक्टअटइंडेक्स: 0] पथकुंजियां]; के लिए (एनएसयूइन्टेगीर I = 1; आई & lt; [सभीपाथ गिनती]; आई ++) {एनएसएआरआरए * यह पाथ कॉंप्स = [[ऑलपैथ ऑब्जेक्टअटइंडएक्स: आई] पथकंपनी]; NSUInteger total = [currentCommonComps गिनती]; अगर ([इसपेथ कॉंप्स गिनती] & lt; कुल) कुल = [यह पाथ कॉंप्स गिनती]; NSUInteger j; के लिए (जे = 0; जे एंड एलटी; कुल; जे ++) यदि (! [[वर्तमान कॉमन कॉंप्स ऑब्जेक्टऐटीइंडएक्स: जे] एवलटाओस्ट्रिंग: [यह पाथ कॉम्प्स ऑब्जेक्टऐटीइंड: जे]] ब्रेक; यदि (जे एंड एलटी; [वर्तमान कॉमन कॉंप्स गिनती]) वर्तमान कॉमन कॉंप्स = [वर्तमान कॉमन कॉम्प्स सबरेरेविथ रेंज: एनएसएमकेरेंज (0, जे)]; अगर ([वर्तमान कॉमन कॉंप्स गिनती] == 0) तोड़; // कोई बिंदु नहीं हो रहा है) // मौजूदा कॉमन कॉम्प्स में एक साथ मिलें  

यदि आप ऑटोरियरीज पूल को साफ रखना चाहते हैं, तो आप इन ऑब्जेक्ट्स को स्पष्ट रूप से आवंटित और रिलीज करना चाहते हैं, खासकर यदि आपके पास पथों की बड़ी सरणी।


Comments