【问题标题】:NSSearchPathForDirectoriesInDomains NSUserDomainMaskNSSearchPathForDirectoriesInDomains NSUserDomainMask
【发布时间】:2013-05-09 19:58:01
【问题描述】:

使用 URLConnection 我正在从 url 下载文件并将该数据存储到文档目录中的文件中。当我收到响应时,当调用 didReceiveResponse: 方法时,我创建文件并以这种方式移动到该文件的末尾:

NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:self.fileName];
NSLog(@"filepath is %@",filePath);
[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
file = [[NSFileHandle fileHandleForUpdatingAtPath:filePath] retain];
[file seekToEndOfFile];

其中 File 是 NSFileHandle 类的对象。稍后在接收数据时,每当调用 didReceiveData:(NSData *)data 方法时,我都会以这种方式将接收到的数据存储到文件中:

[file seekToEndOfFile];
[file writeData:data];

最后我以这种方式关闭 connectionDidFinishLoading: 方法中的文件:

[file closeFile];

当我在我的系统中构建和运行时它正在工作。但是当我复制到另一个系统并尝试构建时,我得到了这个错误:

Terminating app due to uncaught exception `'NSFileHandleOperationException'`, reason: '*** `-[NSConcreteFileHandle seekToEndOfFile]: No such file or directory'`

我推荐了http://www.techotopia.com/index.php/Working_with_Directories_on_iPhone_OSWhat is NSSearchPathForDirectoriesInDomains? 了解 NSSearchPathForDirectoriesInDomain 功能,但我仍然不清楚。

UserDomainMask 将根据项目所在的系统和用户返回正确的路径。如果是这样,为什么我会收到这样的错误?

他们说返回的路径(存储在文件路径中)将是路径 /Users//Library/Application Support/iPhone Simulator/User/Application//Documents where

是当前登录到运行模拟器的 Mac OS X 系统的用户名,是应用的唯一 ID

谁能帮助我,了解我为什么会收到这样的错误。

【问题讨论】:

  • 我已经更改了问题并添加了一些使用 NSSearchFilePathInDirectoriesForDomain 函数的代码

标签: ios xcode4.2 nsfilemanager nsfilehandle


【解决方案1】:
-(NSString *) filePath
{

    NSArray *paths = NSSearchPathForDirectoriesInDomains(

                                                         NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDir = [paths objectAtIndex:0];
    NSLog(@"documentsDir %@",documentsDir);

    return [documentsDir stringByAppendingPathComponent:@"xxxxx.sql"];
}

【讨论】:

  • 使用 sqlite3 *details; 时只需调用此函数即可获取文件路径int result = sqlite3_open([[self filePath] UTF8String], &details);如果(结果!= SQLITE_OK)
【解决方案2】:

根据您的要求没有源代码并且您显示异常 所以我们有这些写作和阅读的路径。并分享你使用的东西?

文件

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

图书馆

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryDirectory = [paths objectAtIndex:0];

缓存目录

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [paths objectAtIndex:0];
BOOL isDir = NO;
NSError *error;
if (! [[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDir] && isDir == NO) {
    [[NSFileManager defaultManager] createDirectoryAtPath:cachePath withIntermediateDirectories:NO attributes:nil error:&error];
}

您可以使用路径进行阅读和写作。更多信息请参见Answer

【讨论】:

  • 我了解如何使用它。我已经更改了我的问题以包含一些解释代码。我的疑问在于返回的路径。
  • @aparna 不太清楚请尝试我的代码行清理代码然后测试
  • k 我会更改代码,我会告诉你它是否有效。谢谢。
  • 使用 [... firstObject] 代替 [... objectAtIndex:0] 更安全;例如:NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachePath = [paths firstObject];
猜你喜欢
  • 2012-01-19
  • 2010-11-13
  • 2014-08-06
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
相关资源
最近更新 更多