Сообщить о нечувствительности к регистру в OSX (используя OSXFuse)

Я создал файловую систему без учета регистра в 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;
}

person trungdinhtrong    schedule 27.11.2017    source источник
comment
Я в основном в той же ситуации; У меня есть файловая система osxfuse, настроенная на режим без учета регистра, и как getattrlist, так и pathconf указывают, что она нечувствительна к регистру, но проверка NSURL этого не делает. Вы когда-нибудь выясняли, как заставить его возвращать правильный результат?   -  person Wez Furlong    schedule 23.09.2020


Ответы (1)


Вы уверены, что ваш путь правильный в первом фрагменте кода, то есть отсутствует косая черта в начале?

NSString *path = @"Volumes/MyVolume";

В противном случае этот код, кажется, работает для меня.

person mschmidt    schedule 28.11.2017
comment
Ах, простите за опечатку. Я только что отредактировал код. После копирования-вставки я немного переформатировал код и случайно удалил косую черту. Первый и второй фрагменты работают в том смысле, что они запускались и сообщали, что мой том чувствителен к регистру. Я просто не знаю, как сделать так, чтобы мой том регистрировался в OSX как нечувствительный к регистру. - person trungdinhtrong; 28.11.2017