在 iOS 调整中,我有一个很长的文本,并将其存储在与 .xm 文件位于同一文件夹级别的文本文件中。假设我有一个调整项目,其中一个 Tweak.xm 文件位于项目的顶层,另一个名为 myFile.txt 的文件与 Tweak.xm 位于同一文件夹级别。如何在xm代码中读取这个txt文件的内容?
我尝试了这个 Objective-C 代码,但出现了错误,因为文件路径可能不正确。
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myFile" ofType:@"txt"];
NSError *error = nil;
NSString *fileContent = [NSString stringWithContentsOfFile:filePath
encoding:NSUTF8StringEncoding
error:&error];
if (error) {
NSLog(@"Error reading file: %@", error);
NSLog(@"File Path: %@", filePath);
// the log error is `Error reading file: Error Domain=NSCocoaErrorDomain Code=258 "The file name is invalid."`
} else {
NSLog(@"File Content:\n%@", fileContent);
}
我做了一些重新设计,但它应该可以正确地满足您的目的。
示例代码:
NSError *error = nil;
// Open the file and create it if it doesn't exist
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths firstObject];
NSString *filePath = [NSString stringWithFormat:@"%@/myFile.txt", documentsDirectory];
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];
if (fileHandle == nil) {
[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
}
// Open the output stream
NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:YES];
[outputStream open];
// Open the input stream
NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:filePath];
[inputStream open];
// What you are writing
NSString *printString = [NSString stringWithFormat:@"Hello Logos\n"];
// Write to file
[fileHandle seekToEndOfFile];
NSData *contentData = [printString dataUsingEncoding:NSUTF8StringEncoding];
[outputStream write:contentData.bytes maxLength:contentData.length];
// Read from file
size_t fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:&error] fileSize];
if(error) {
NSLog(@"Error reading file: %@", error);
return;
}
NSMutableData* data = [NSMutableData dataWithLength:fileSize];
size_t result = [inputStream read:(uint8_t *)data.bytes maxLength:fileSize];
if(result != fileSize) {
NSLog(@"Failed to read %zu bytes, only read %zu!", fileSize, result);
}
NSLog(@"%@: contains:\n%@", filePath, [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
试运行:
❯ xcrun clang -arch x86_64 -isysroot $(xcrun --sdk macosx --show-sdk-path) -O3 -DNDEBUG test.m -o test -framework Foundation
/var/folders/x2/gjkg0qk92j92svxfk1x1cn100000gn/T
❯ rm ~/Documents/myFile.txt
rm: cannot remove '/Users/cryptic/Documents/myFile.txt': No such file or directory
/var/folders/x2/gjkg0qk92j92svxfk1x1cn100000gn/T
❯ ./test
2023-08-27 19:48:23.654 test[2318:1592365] /Users/cryptic/Documents/myFile.txt: contains:
Hello Logos
/var/folders/x2/gjkg0qk92j92svxfk1x1cn100000gn/T
❯ ./test
2023-08-27 19:48:24.381 test[2361:1592410] /Users/cryptic/Documents/myFile.txt: contains:
Hello Logos
Hello Logos
/var/folders/x2/gjkg0qk92j92svxfk1x1cn100000gn/T
❯ ./test
2023-08-27 19:48:25.304 test[2387:1592456] /Users/cryptic/Documents/myFile.txt: contains:
Hello Logos
Hello Logos
Hello Logos
/var/folders/x2/gjkg0qk92j92svxfk1x1cn100000gn/T
❯