Я посмотрел вокруг и не нашел 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