Macos NSFileManager表示文件不可写
我一直在尝试使用AVFoundation来记录屏幕输出。由于未知的原因,在我升级到最新版本的Mac(Mountain Lion)后,它停止了工作。我一直在努力让它工作,但到目前为止没有成效。我知道如果输出文件已经存在,AVFoundation方法Macos NSFileManager表示文件不可写,macos,cocoa,avfoundation,nsfilemanager,Macos,Cocoa,Avfoundation,Nsfilemanager,我一直在尝试使用AVFoundation来记录屏幕输出。由于未知的原因,在我升级到最新版本的Mac(Mountain Lion)后,它停止了工作。我一直在努力让它工作,但到目前为止没有成效。我知道如果输出文件已经存在,AVFoundation方法startRecordingToOutputFileURL将无法工作。因此,我尝试使用NSFileManager查看目标文件是否存在以及是否可写。My Filemanager始终返回与目标文件不存在且不可写对应的值。我试图将文件权限设置为无效,有人能解释
startRecordingToOutputFileURL
将无法工作。因此,我尝试使用NSFileManager
查看目标文件是否存在以及是否可写。My 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...");
}
未展开的波浪形块在Cocoa中不是有效路径。必须对传递到
NSURL
的-initFileURLWithPath:
中的字符串使用-stringByExpandingTildeInPath
或更好的-stringbystandardingpath
因此,NSFileManager将为isWritableFileAtPath返回NO,因为它是无效路径(因此不可写)。这会导致您的NSLog()被触发
根据评论更新:
您可能仍然会发现NSURL在创建时返回nil(因此调用-path将返回nil),因为路径仍然无效。同样值得注意的是,文档中对-isWritableFileAtPath:“尝试一项操作(如加载文件或创建目录)、检查错误并妥善处理这些错误要比尝试提前判断操作是否会成功要好得多。”
接受Peter Hosey的建议,如果在尝试写入文件时调用失败,请使用NSError,不要试图提前找出原因 我曾尝试使用苹果公司的“AVScreenShack”示例代码,该代码本应将屏幕数据记录到桌面上,但未能记录…更改您的
错误:nil
。给它一个指向NSError*
变量的指针,您可以在失败时检查该变量以找出问题所在。它想告诉你出了什么问题,但你不让它这样做。我不确定这是否是问题所在。我使用了你的想法,当它不起作用时,我甚至尝试给出绝对路径…'dest=[[NSURL alloc]initFileURLWithPath:@”/Users/Tester/cococoa Trys/myMovie.mov“;'这也不起作用……然后我会接受Peter Hosey的建议,利用方法失败时可能设置的实际错误。一个简单的n错误*myError=nil
然后在调用-iswriteablefileatpath:
时传入myError
,如果您NSLog(@“%@”,myError),则会显示很多信息代码>如果呼叫失败。