如何在 iOS 调整中读取文本文件的内容

问题描述 投票:0回答:1

在 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);

    
}
ios objective-c jailbreak
1个回答
0
投票

我做了一些重新设计,但它应该可以正确地满足您的目的。

示例代码:

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
❯

© www.soinside.com 2019 - 2024. All rights reserved.