当我们编写命令行程序时,如果不想直接处理main函数的argv和argc参数,可以使用NSProcessInfo类来处理命令行参数,从而避免处理C字符串。
| NSProcessInfo类方法 | |
| 方法 | 描述 |
| +(NSProcessInfo *) processInfo | 返回当前进程的信息 |
| -(NSArray *) arguments | 以NSString对象数组的形式返回当前进程的参数 |
| -(NSDictionary *) environment | 返回变量/值对词典,以描述当前的环境变量(比如PATH和HOME)及其值 |
| -(int) processIdentifier | 返回进程标识符,它是操作系统赋予进程的唯一数字,用于识别每个正在运行的进程 |
| -(NSString *) processName | 返回当前正在执行的进程名称 |
| -(NSString *) globallyUniqueString | 每次调用这个方法时,都返回不同的单值字符串。可以用这个字符串生成单值临时文件名 |
| -(NSString *) hostName | 返回主机系统的名称(在笔者的OS X系统中,返回的是xxxxxdeMacBook-Pro.local) |
| -(NSUInteger) operatingSystem | 返回表示操作系统的数字 |
| -(NSString *) operatingSystemName | 返回操作系统的名称(在笔者的Mac上,返回常量NSMACHOperatingSystem,其中可能的返回值定义在NSProcessInfo.h中) |
| -(NSString *) operatingSystemVersionString | 返回操作系统的当前版本(在笔者的Mac OS X系统中,返回Version 10.14.2 (Build 18C54)) |
| -(void) setProcessName: (NSString *) name | 将当前进程名称设置为name。应该谨慎地使用这个方法,因为关于进程名称存在一些假设(比如用户默认的设置) |
示例一:通过命令行参数复制文件
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSFileManager *fm;
NSString *source, *dest;
NSProcessInfo *proc = [NSProcessInfo processInfo];
// 获取输入的命令行参数
NSArray *args = [proc arguments];
fm = [NSFileManager defaultManager];
NSLog(@"%@", [fm currentDirectoryPath]);
// 检查命令行中的两个参数
if ([args count] != 3) {
NSLog(@"Usage: %@ src dest", [proc processName]);
return 1;
}
source = args[1];
dest = args[2];
// 确定能够读取源文件
if ([fm isReadableFileAtPath: source] == NO) {
NSLog(@"Can't read %@", source);
return 2;
}
// 目标文件是否是一个目录
// 若是,添加源到目标的结尾
BOOL isDir;
[fm fileExistsAtPath: dest isDirectory: &isDir];
if (isDir == YES)
dest = [dest stringByAppendingPathComponent: [source lastPathComponent]];
// 若目标文件已存在,则删除文件
[fm removeItemAtPath: dest error: NULL];
// 执行复制
if ([fm copyItemAtPath: source toPath: dest error: NULL] == NO) {
NSLog(@"Copy failed!");
return 3;
}
NSLog(@"Copy of %@ to %@ succeeded!", source, dest);
}
return 0;
}
----------------------------------------------------------------------------------------------------------
小知识