NSFileManager 说文件不可写 Mac

Posted

技术标签:

【中文标题】NSFileManager 说文件不可写 Mac【英文标题】:NSFileManager says a file not writable Mac 【发布时间】:2012-12-28 16:15:22 【问题描述】:

我一直在尝试使用 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...");
    

【问题讨论】:

我曾尝试使用 Apple 的 'AVScreenShack' 示例代码,它应该将屏幕数据记录到桌面但未能记录... 更改您的error:nil。给它一个指向NSError *variable 的指针,您可以检查它以找出问题所在。它想告诉你出了什么问题,但你不让它。 【参考方案1】:

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

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

基于 cmets 的更新:

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

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

【讨论】:

我不确定这是否是问题所在。我使用了你的想法,当它不起作用时,我什至尝试给出绝对路径...'dest = [[NSURL alloc] initFileURLWithPath:@"/Users/Tester/Cocoa Trys/myMovie.mov"];'这也没有用... 那么我会听取 Peter Hosey 的建议,并利用该方法在失败时可以设置的实际错误。一个简单的NSError * myError = nil; 然后在调用-isWritableFileAtPath: 时传入myError,如果你NSLog(@"%@", myError); 调用失败,则会显示很多信息。

以上是关于NSFileManager 说文件不可写 Mac的主要内容,如果未能解决你的问题,请参考以下文章

Foundation框架中的NSFileManager一

在 iOS 中使用 NSFileManager 写入文件

NSFileManager 是不是将修改日期等元数据与文件一起复制?

Brew Doctor 说:“警告:/usr/local/include 不可写。”

解决[[NSFileManager defaultManager] contentsOfDirectoryAtPath 方法获取不到数据的bug

NSFileManager.contentsOfDirectoryAtURL 返回的文件根据 NSFileManager.fileExistsAtPath 不存在?