MAC OS X:如何确定文件系统是否区分大小写?

tro*_*foe 7 filesystems api macos case-sensitive

我已经使用statfs(2)系统调用来获得Mac OS X文件系统的许多特性,但它并没有告诉我文件系统是否区分大小写.

我需要这些信息为我发展将围绕移动许多文件的应用程序,我想检测数据的潜在损失,由于文件从一个区分移动敏感的文件系统的区分大小写的文件系统.

任何人都可以提出一种检测方法吗?

小智 9

我环顾四周,还没有找到适合自己的API.我能想到两种可能性:

  • 创建一个临时文件并尝试使用不同的案例模式打开它,例如创建"a9999"并尝试打开"A9999".考虑到该特定目录上既没有"a9999"也没有"A9999",当且仅当打开"A9999"失败时,文件系统才区分大小写.
  • diskutil(8)针对文件系统运行.它以不同的方式报告区分大小写,不敏感的文件系统:Name: Mac OS Extended (Case-sensitive)vs. 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;
}
Run Code Online (Sandbox Code Playgroud)

输出示例:

./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
Run Code Online (Sandbox Code Playgroud)


小智 9

如果你已经在使用stat(2),那么你可以很容易地使用pathconf(2)_PC_CASE_SENSITIVE选择(结果0=情况下,钝感,1=区分大小写.请注意,手册页是过时的,但_PC_CASE_SENSITIVE_PC_CASE_PRESERVING如果一个文件系统的支持.按照惯例,不支持_PC_CASE_SENSITIVE选择器然后它区分大小写.


ism*_*ail 6

创建一个大写字母一个临时文件,并检查文件是否存在使用小写字母,如果测试失败,文件系统区分大小写的.

  • 不,它也是一个跨平台的解决方案:) (4认同)