简体   繁体   中英

How to open a file in iOS using C?

Solution

There was no error, I didn't pay attention. Thanks to Rob for pointing this out


I have an iOS app that need to read files using a C library.

I only get permission denied error (13) no such file or directory when I try to access the file from the C function, and I can't find the cause. It doesn't happen when I create, read or write using Swift.

I tried several methods to create file URL inside the user data container, nothing works with C, it only works with Swift.

Even when the file is being created with Swift, being opened, read and verified before and after the C call, it only have errors in C.

Things I tried

// I tried different paths before and added the filename to these directories
// FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
// FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!

let path: String = NSTemporaryDirectory().appending("test_file.txt")
FileManager.default.fileExists(atPath: path.path)
// true

XCTAssertNoThrow(try "test".write(to: URL(fileURLWithPath: path), atomically: true, encoding: .utf8))
        XCTAssertNoThrow(try FileManager.default.setAttributes([FileAttributeKey.posixPermissions: 0o777], ofItemAtPath: path))

// call C
test_read_file(path)

FileManager.default.fileExists(atPath: path.path)
// true
// test_read_file.c
int test_read_file(const char* path) {
  access(file_path, W_OK);
  // returns 0
  
  open(path, O_RDONLY);
  // returns 13

  // errno is 2 (ENOENT: No such file or directory)

  return 0;
}

Correction The errno value is 2

ENOENT 2 No such file or directory

The 13 return value is a file handle, not an error code, and suggests your code is working exactly as you expect.

open returns a non-negative value for success, and -1 for failure. To check the specific error, you check errno .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM