MAC OS X: как определить, чувствительна ли файловая система к регистру? - PullRequest
7 голосов
/ 16 января 2011

Я использовал системный вызов statfs (2) для получения многих характеристик файловой системы Mac OS X, но он не сообщает мне, чувствительна ли к регистру файловая система.

Мне нужна эта информация, так как разрабатываемое мной приложение будет перемещать множество файлов, и я хочу обнаружить потенциальную потерю данных из-за перемещения файлов из файловой системы , чувствительной к регистру , в регистр- нечувствительная файловая система.

Кто-нибудь может предложить способ обнаружения этого?

Ответы [ 4 ]

9 голосов
/ 05 марта 2011

Если вы уже используете stat(2), то вы можете легко использовать pathconf(2) с селектором _PC_CASE_SENSITIVE (результат 0 = без учета регистра, 1 = с учетом регистра) Обратите внимание, что страница руководства устарела, но поддерживаются _PC_CASE_SENSITIVE и _PC_CASE_PRESERVING. По соглашению, если файловая система не поддерживает селектор _PC_CASE_SENSITIVE, тогда она чувствительна к регистру.

9 голосов
/ 16 января 2011

Я посмотрел вокруг и не нашел API для этого.Есть две возможности:

  • Создание временного файла и попытка открыть его с другим шаблоном дела, например, создание «a9999» и попытка открыть «A9999».Учитывая, что ни "a9999", ни "A9999" не были доступны в этом конкретном каталоге, файловая система чувствительна к регистру тогда и только тогда, когда открытие "A9999" завершается неудачно.Он сообщает о чувствительных к регистру и нечувствительных файловых системах по-разному: Name: Mac OS Extended (Case-sensitive) против Name: Mac OS Extended (не регистрируется).

Поскольку diskutil(8) может идентифицировать это, это может быть случай, когдаэта информация доступна через некоторый API или системный вызов.


Редактировать: Оказывается, что 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
6 голосов
/ 16 января 2011

Создайте временный файл с заглавными буквами и проверьте, существует ли файл с использованием строчных букв, если тест не пройден файловой системой

1 голос
/ 16 января 2011

Найдите здесь код для поиска подтипа HFS устройства:

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

Подпрограмма is_hfs вернет подтип hfs. Если подтипом является kHFSXSubType или kHFSXJSubType, то это устройство HFSX (чувствительно к регистру).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...