基于Objective-C与C ++文件的数据交换

时间:2012-01-04 13:47:55

标签: iphone objective-c ios objective-c++

由于某些原因,我评估了我的iOS-App和我的C ++-Lib(由iOS-App使用)之间按文件交换数据的选项。

C ++(在本地计算机上运行正常):

    void LibFacadeTest::testFileAccess()
    {
      this->log->info("start testFileAccess");

        char filename[] = "./test.txt";
        std::string result;

        LibFacade *e = new LibFacade();

        try
        {
            result = e->testFileAccess(filename);
        }
        catch(...)
        {
            this->log->error("error");
        }
        this->log->info("Result:" + result);

        delete(e);
  }

为ARM重新编译并在设备上运行我可以看到filename参数正确传递(通过日志),但没有返回任何内容。

这是Objective-C代码:

LibFacade *tlb = new LibFacade();
char *testName = "blub.txt";

std::string str = tlb->testFileAccess(testName);

// Check, if file exists
NSFileManager *filemgr;

filemgr = [NSFileManager defaultManager];

if ([filemgr fileExistsAtPath: @"blub.txt" ] == YES)
    NSLog (@"File exists");
else
    NSLog (@"File not found");

NSError *error = nil;
NSString *myString = [NSString stringWithContentsOfFile:@"blub.txt" encoding:NSUTF8StringEncoding error:&error];

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:myString                                               
delegate:nil                                                      cancelButtonTitle:nil                                                destructiveButtonTitle:myString                                                      otherButtonTitles:nil];
    [actionSheet showInView:self.view];

有点快速和肮脏,但我可以看到,虽然可以使用lib,但设备上没有创建文件。

我的问题: 从包含的C ++库访问设备文件系统有什么限制吗?我是否必须使用任何特殊目录进行文件交换?

1 个答案:

答案 0 :(得分:4)

您的应用程序是“沙盒”,这意味着它无法访问其临时文档空间和文档文件空间之外的文件。 "./test.txt"位于“沙箱区域”之外,因此iOS正确无法访问该文件。简而言之,如果您想使用临时文件传输数据,那么您需要这样的文件名:

NSString *tempDirectoryName =
    [NSTemporaryDirectory() stringByAppendingPathComponent:@"test.txt"];

This document提供了有关该主题的进一步阅读。