2011-01-16 10 views
7

मैक ओएस एक्स फाइल सिस्टम की कई विशेषताओं को प्राप्त करने के लिए मैंने statfs(2) सिस्टम कॉल का उपयोग किया है, लेकिन यह मुझे नहीं बताता है कि फाइल सिस्टम केस-संवेदी है या नहीं।मैक ओएस एक्स: कैसे निर्धारित करें कि फाइल सिस्टम केस संवेदनशील है या नहीं?

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

क्या कोई इसका पता लगाने का तरीका सुझा सकता है?

उत्तर

9

आप पहले से ही stat(2) का उपयोग कर रहे हैं, तो आप आसानी से pathconf(2)_PC_CASE_SENSITIVE चयनकर्ता के साथ उपयोग कर सकते हैं (परिणाम 0 = केस-insensitve, 1 = केस-संवेदी। ध्यान दें कि आदमी पेज पुराना हो चुका है, लेकिन _PC_CASE_SENSITIVE और _PC_CASE_PRESERVING तो यह केस-संवेदी है अगर एक फाइल सिस्टम _PC_CASE_SENSITIVE चयनकर्ता का समर्थन नहीं करता समर्थित हैं। परंपरा के मुताबिक,।

+0

आह उत्कृष्ट सामान। बहुत धन्यवाद। – trojanfoe

+0

http://lists.apple.com/archives/darwin-dev/2007/Apr/msg00036.html सुझाव देता है कि यह विश्वसनीय नहीं है। – thakis

6

अपरकेस अक्षरों के साथ एक अस्थायी फ़ाइल बनाएं और जांचें कि फ़ाइल लोअरकेस अक्षरों का उपयोग कर मौजूद है, यदि परीक्षण फ़ाइल सिस्टम केस-संवेदी है।

+0

हाँ जो शायद काम करेगा - थोड़ा क्रूड लगता है :) – trojanfoe

+4

नहीं, यह भी एक क्रॉस प्लेटफॉर्म समाधान :) – ismail

9

मैंने देखा है और इसके लिए एक एपीआई नहीं मिला है। ऐसी दो संभावनाएं हैं जिन पर मैं सोच सकता हूं:

  • एक अस्थायी फ़ाइल बनाना और इसे एक अलग केस पैटर्न के साथ खोलने का प्रयास करना, उदाहरण के लिए "ए 99 99" बनाना और "ए 99 99" खोलने की कोशिश कर रहा है। इस विशेष निर्देशिका पर न तो "ए 99 99" और न ही "ए 99 99" उपलब्ध थे, फाइल सिस्टम केस-संवेदी है अगर केवल "ए 99 99" खोलने में विफल रहता है।
  • फाइल सिस्टम के विरुद्ध diskutil(8) चल रहा है। Name: Mac OS Extended (Case-sensitive) बनाम Name: Mac OS Extended (नहीं जर्नल): यह केस-संवेदी, -insensitive फाइल सिस्टम को अलग ढंग से रिपोर्ट।

चूंकि diskutil(8) यह पहचानने में सक्षम है, यह मामला हो सकता है कि यह जानकारी कुछ एपीआई या सिस्टम कॉल के माध्यम से उपलब्ध है।


संपादित करें: यह पता चला NSURL तरीकों कि फाइल सिस्टम गुण पर काम का एक सेट है। विशेष रूप से, -getResourceValue:forKey:error कुंजी NSURLVolumeSupportsCaseSensitiveNamesKey के साथ आपको बताएगी कि एक दी गई फाइल सिस्टम (NSURL उदाहरण के रूप में प्रतिनिधित्व) केस संवेदनशील नामों का समर्थन करता है।

इसके उपयोग के उदाहरण के लिए निम्नलिखित कोड देखें।

#include <Foundation/Foundation.h> 

int main(int argc, char *argv[]) { 
    NSAutoreleasePool *pool = [NSAutoreleasePool new]; 

    NSString *path = [NSString stringWithCString:argv[1] encoding:NSASCIIStringEncoding]; 
    NSURL *filesystem = [NSURL fileURLWithPath:path isDirectory:YES]; 

    NSNumber *caseSensitiveFS; 
    BOOL hasCaseSensitiveResource; 

    hasCaseSensitiveResource = [filesystem getResourceValue:&caseSensitiveFS 
    forKey:NSURLVolumeSupportsCaseSensitiveNamesKey error:NULL]; 

    if (hasCaseSensitiveResource) 
    { 
    if ([caseSensitiveFS intValue] == 1) 
    { 
     NSLog(@"%s is a case sensitive filesystem", argv[1]); 
    } 
    else 
    { 
     NSLog(@"%s is a case insensitive filesystem", argv[1]); 
    } 
    } 
    else 
    { 
    NSLog(@"can't query %s for case sensitiveness", argv[1]); 
    } 

    [pool drain]; 
    return 0; 
} 

आउटपुट उदाहरण:

./testcase/
/is a case insensitive filesystem 

./testcase /Volumes/Disk\ Image/ 
/Volumes/Disk Image/ is a case sensitive filesystem 

./testcase nonono 
can't query nonono for case sensitiveness 
+0

मुझे यह उल्लेख करना चाहिए था कि मैं सी ++ का उपयोग कर रहा हूं, उद्देश्य-सी नहीं; क्या कोई सी/सी ++ समाधान है? – trojanfoe

+0

वास्तव में इसके बारे में सोचते हुए, यह सबसे उपयोगी समाधान हो सकता है - ऐसा कोई कारण नहीं है कि मैं अपने आवेदन में इसका उपयोग क्यों नहीं कर सका। – trojanfoe

+0

@trojanfoe अब मुझे पता है। यहां तक ​​कि यदि libfs आसानी से उपलब्ध नहीं है, तो आप केन के उत्तर में बताए गए FSFormatName.c के स्रोत कोड का उपयोग करने का प्रयास कर सकते हैं। ऐसा लगता है कि यह सिर्फ कुछ ब्लॉक पढ़ रहा है और, इसके लायक होने के लिए, /usr/include के अंतर्गत उपलब्ध है। –

1

एक उपकरण के HFS उप प्रकार खोजने के लिए कुछ कोड के लिए यहाँ देखो:

http://www.opensource.apple.com/source/libfs/libfs-3/FSFormatName.c

दिनचर्या is_hfs HFS उप प्रकार वापस आ जाएगी। यदि सबटाइप kHFSXSubType या kHFSXJSubType है, तो यह एक HFSX (केस संवेदनशील) डिवाइस है।

+0

हम्म, दिलचस्प। –

+0

हालांकि, मैं अपने सिस्टम पर libfs खोजने में सक्षम नहीं हूं। और ऐसा लगता है कि सिस्टम पुस्तकालयों में से कोई भी FSFormatName.h में घोषित कार्यों को निर्यात नहीं करता है। –

+0

उत्कृष्ट; बहुत धन्यवाद। क्या कुछ और सामान्य है जो अन्य फाइल सिस्टम प्रकारों को कवर करता है? – trojanfoe

संबंधित मुद्दे