Я создал файловую систему без учета регистра в OSX (используя OSXFuse). Но когда я попытался проверить нечувствительность к регистру моего тома, используя NSURLVolumeSupportsCaseSensitiveNamesKey
, он сообщил, что он чувствителен к регистру. Мой вопрос: что мне нужно сделать в OSX, чтобы при проверке чувствительности к регистру с помощью NSURLVolumeSupportsCaseSensitiveNamesKey
он правильно сообщал о моей файловой системе как о нечувствительной к регистру?
Ниже приведены более подробные сведения о том, что я сделал:
Вот как я использовал NSURLVolumeSupportsCaseSensitiveNamesKey
для проверки нечувствительности к регистру:
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");
}
}
Обратите внимание, что когда я использовал 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");
}
}
Я считаю, что getattrlist
сообщил об этом правильно, потому что я использовал osxfuse для реализации fuse_operations.init следующим образом:
void fuse_init(void* user_data, struct fuse_conn_info* conn) {
conn->want |= FUSE_CAP_CASE_INSENSITIVE;
}