1

我一直在尝试使用 AVFoundation 来记录屏幕输出。由于未知的原因,在我迁移到最新版本的 Mac(Mountain Lion)后它停止工作。我一直在努力让它发挥作用,但到目前为止还没有成果。我知道startRecordingToOutputFileURL如果输出文件已经存在,则 AVFoundation 方法将不起作用。因此,我尝试使用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...");
    }
4

1 回答 1

2

未扩展的波浪线不是 Cocoa 中的有效路径。您必须在传递给's的字符串上使用-stringByExpandingTildeInPath或更好。-stringByStandardizingPathNSURL-initFileURLWithPath:

因此,NSFileManager 将为 isWritableFileAtPath 返回 NO,因为它是无效路径(因此它不可写)。这会导致您的 NSLog() 被解雇。

根据评论更新:

您可能仍然会发现 NSURL 在创建时返回 nil(因此调用 -path 将返回 nil),因为路径仍然无效。同样值得注意的是,文档中说 -isWritableFileAtPath:,“尝试操作(例如加载文件或创建目录)、检查错误并优雅地处理这些错误比尝试提前解决要好得多手术能否成功的时间。”

采纳 Peter Hosey 的建议,如果在您尝试写入文件时调用失败,请使用 NSError并且不要尝试提前弄清楚。

于 2012-12-28T16:53:50.977 回答