tro*_*foe 7 filesystems api macos case-sensitive
我已经使用statfs(2)系统调用来获得Mac OS X文件系统的许多特性,但它并没有告诉我文件系统是否区分大小写.
我需要这些信息为我发展将围绕移动许多文件的应用程序,我想检测数据的潜在损失,由于文件从一个区分移动敏感的文件系统的区分大小写的文件系统.
任何人都可以提出一种检测方法吗?
小智 9
我环顾四周,还没有找到适合自己的API.我能想到两种可能性:
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
选择器然后它区分大小写.
归档时间: |
|
查看次数: |
7471 次 |
最近记录: |