2017-11-27 3 views
2

OSXFuse를 사용하여 대/소문자를 구분하지 않는 파일 시스템을 만들었습니다. 그러나 NSURLVolumeSupportsCaseSensitiveNamesKey을 사용하여 내 볼륨의 대소 문자를 구분하려고 할 때 대소 문자를 구분하여보고했습니다. 내 질문은 OSX에서해야 할 일은 무엇입니까? NSURLVolumeSupportsCaseSensitiveNamesKey을 사용하여 대소 문자를 구분할 때 대소 문자를 구분하지 않고 파일 시스템을 올바르게보고합니다.(OSXFuse 사용) OSX에서 대소 문자를 구분하지 않음

이 내가 소문자 구분을 확인하는 NSURLVolumeSupportsCaseSensitiveNamesKey을 사용하는 방법은 다음과 같습니다 :

벨로 내가 무슨 짓을했는지에 대한 자세한 내용은 내가 getattrlist을 사용하는 경우

NSString *path = @"/Volumes/MyVolume"; 
NSURL *file_system = [NSURL fileURLWithPath:path isDirectory:YES]; 
NSNumber *case_sensitive_fs; 
BOOL has_case_sensitive_resource = [file_system getResourceValue:&case_sensitive_fs 
                  forKey:NSURLVolumeSupportsCaseSensitiveNamesKey 
                  error:NULL]; 
if (!has_case_sensitive_resource) { 
    LOG("Has no case sensitive resource"); 
} else { 
    if ([case_sensitive_fs intValue] ==1) { 
    LOG("This is case sensitive file system"); 
    } else { 
    LOG("This is case insensitive file system"); 
    } 
} 

, 그것은 올바르게보고 나의 파일 시스템이 내가 구현하는 osxfuse을 사용했기 때문에 getattrlist 올바르게보고 생각

typedef struct volume_capabilities_result { 
     u_int32_t length; 
     vol_capabilities_attr_t volume_capability; 
    } VolumeCapabilitiesResult; 
//... 
    struct attrlist list = { 0 }; 
    list.bitmapcount = ATTR_BIT_MAP_COUNT; 
    list.reserved = 0; 
    list.volattr = ATTR_VOL_INFO | ATTR_VOL_CAPABILITIES; 

    VolumeCapabilitiesResult volumeCapResult; 
    int result = getattrlist("/Volumes/MyVolume", &list, &volumeCapResult, sizeof(volumeCapResult), 0); 
    if (result != -1 && 
     (volumeCapResult.volume_capability.valid[VOL_CAPABILITIES_FORMAT] & VOL_CAP_FMT_CASE_SENSITIVE) != 0) { 
     bool case_senstive = (volumeCapResult.volume_capability.capabilities[VOL_CAPABILITIES_FORMAT] & 
            VOL_CAP_FMT_CASE_SENSITIVE) != 0; 
     if (case_senstive) { 
     LOG("getattrlist said we are case sensitive"); 
     } else { 
     LOG("getattrlist said we are case insensitive"); 
     } 
    } 

: 대소 문자를 구별했다 다음과 같은 fuse_operations.init :

void fuse_init(void* user_data, struct fuse_conn_info* conn) { 
    conn->want |= FUSE_CAP_CASE_INSENSITIVE; 
} 

답변

0

당신에게 있습니까 확실히 경로는 처음에 즉 누락 된 슬래시, 최초의 코드에 맞습니까?

NSString *path = @"Volumes/MyVolume"; 

그렇지 않으면이 코드가 저에게 효과적 인 것으로 보입니다.

+1

오, 미안 해요. 방금 코드를 편집했습니다. 복사하여 붙여 넣기를 한 후에 코드를 다시 포맷하고 실수로 슬래시를 삭제했습니다. 첫 번째와 두 번째 발췌 문장은 실행되어 내 볼륨이 대소 문자를 구분한다는 의미에서 "작동"합니다. 난 그냥 그렇게 어떻게 내 볼륨을 OSX로 대소 문자를 구분하지 않도록 등록을 모릅니다. – trungdinhtrong