在 OSX 中报告不区分大小写(使用 OSXFuse)

Posted

技术标签:

【中文标题】在 OSX 中报告不区分大小写(使用 OSXFuse)【英文标题】:Report case insensitivity in OSX (using OSXFuse) 【发布时间】:2017-11-27 16:18:11 【问题描述】:

我在 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;

【问题讨论】:

我的情况基本相同;我将 osxfuse 文件系统设置为不区分大小写模式,getattrlist 和 pathconf 都表明它不区分大小写,但 NSURL 检查不区分大小写。你有没有想过如何让它返回正确的结果? 【参考方案1】:

你确定你的第一个代码sn-p中的路径是正确的,即开头缺少的斜杠吗?

NSString *path = @"Volumes/MyVolume";

除此之外,这段代码似乎对我有用。

【讨论】:

啊,抱歉打错了。我刚刚编辑了代码。复制粘贴后,我对代码进行了一些重新格式化,并意外删除了斜杠。第一个和第二个 sn-p “工作”,因为它确实运行并报告我的卷区分大小写。我只是不知道如何使我的卷在 OSX 中注册为不区分大小写。

以上是关于在 OSX 中报告不区分大小写(使用 OSXFuse)的主要内容,如果未能解决你的问题,请参考以下文章

sh 在OSX上创建和管理区分大小写的磁盘映像。

不区分大小写的OSX文件系统 - 奇怪的更改目录(cd)bash行为

Git 区分大小写

检查文件系统在 Python 中是不是不区分大小写

如何在 iOS 中读取、写入和检查不区分大小写的文件名?

用于 GCC/G++ 的宏来区分 Linux 和 Mac OSX?