我一直在尝试使用AVFoundation来录制屏幕输出。由于不明原因,我搬到最新版本的Mac(Mountain Lion)后停止了工作。我一直试图让它发挥作用但到目前为止还没有成果。我知道如果输出文件已经存在,AVFoundation方法startRecordingToOutputFileURL
将不起作用。所以,我尝试使用NSFileManager
来查看我的目标文件是否存在以及它是否可写。我的Filemanager总是返回与目标文件不存在相对应的值,而不是可写的。我试图设置文件权限无济于事,任何人都可以解释我可能的错误:
dest = [[NSURL alloc] initFileURLWithPath:@"~/Desktop/myMovie.mov"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init];
[attributes setObject:[NSNumber numberWithInt:777] forKey:NSFilePosixPermissions]; //I tried 511 too, no avail
[fileManager setAttributes:attributes ofItemAtPath:[dest path] error:nil];
if (![fileManager fileExistsAtPath:[dest path]]) {
if ([fileManager isWritableFileAtPath:[dest path]]) {
/* Starts recording to a given URL. */
[captureMovieFileOutput startRecordingToOutputFileURL:dest recordingDelegate:self];
}
else{
NSLog(@"File doesnot exist but is not writable"); //This is the message I get as result
}
}
else
{
NSLog(@"File Exists...");
}
答案 0 :(得分:2)
未扩展的波浪号在Cocoa中不是有效路径。您必须对传递到-stringByExpandingTildeInPath
的{{1}}的字符串使用-stringByStandardizingPath
或更高,NSURL
。
因此,NSFileManager将为isWritableFileAtPath返回NO,因为它是无效路径(因此它不可写)。这会导致您的NSLog()被解雇。
根据评论进行更新:
您可能仍然发现NSURL在创建时返回nil(因此调用-path将返回nil),因为路径仍然无效。另外值得注意的是,文档说的是-isWritableFileAtPath:,“尝试操作(例如加载文件或创建目录),检查错误以及优雅地处理这些错误比试图提前确定更好时间是否会成功。“
考虑到Peter Hosey的建议,如果在尝试写入文件时调用失败,请使用NSError,并且不要提前弄清楚。