标签: nsfilehandle

如何逐行读取NSFileHandle的数据?

我有一个文本文件,其中包含给定的数据

例如

PUFGUjVRallYZDNaazFtVjVObU1zWm5ZcUJUYU5ORk4zbGthNHNDVUdSMlFVQmpSVEoxUUNSallYaFhkanBITXBGR1NTQnpZRTltZE1OalVzSkdXQ0Z6WXR0V2RpTmpTdXgwTWs5V1lZSkZiWjFXT29OV2JSVlhaSTUwYUpwR040UUZXTzVHVXFoWFVRcFdWNHdVTUJ0Q1VHSmxXVlJVTlJCMVE1VTFWV
PUFGUjVRallYZDNaazFtVjVObU1zWm5ZcUJUYU5ORk4zbGthNHNDVUdSMlFVQmpSVEoxUUNSallYaFhkanBITXBGR1NTQnpZRTltZE1OalVzSkdXQ0Z6WXR0V2RpTmpTdXgwTWs5V1lZSkZiWjFXT29OV2JSVlhaSTUwYUpwR040UUZXTzVHVXFoWFVRcFdWNHdVTUJ0Q1VHSmxXVlJVTlJCMVE1VTFWV
Run Code Online (Sandbox Code Playgroud)

现在我想逐行读取数据.这意味着首先我要阅读

PUFGUjVRallYZDNaazFtVjVObU1zWm5ZcUJUYU5ORk4zbGthNHNDVUdSMlFVQmpSVEoxUUNSallYaFhkanBITXBGR1NTQnpZRTltZE1OalVzSkdXQ0Z6WXR0V2RpTmpTdXgwTWs5V1lZSkZiWjFXT29OV2JSVlhaSTUwYUpwR040UUZXTzVHVXFoWFVRcFdWNHdVTUJ0Q1VHSmxXVlJVTlJCMVE1VTFWV
Run Code Online (Sandbox Code Playgroud)

然后下一个剩下的.谁有任何想法?

cocoa objective-c nsfilehandle

49
推荐指数
5
解决办法
4万
查看次数

NSFileHandle fileHandleForWritingAtPath:返回null!

我的iPad应用程序有一个小的下载工具,我想使用NSFileHandle附加数据.问题是创建调用只返回空文件句柄.可能是什么问题呢?以下是应该创建我的文件句柄的三行代码:

NSString *applicationDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
self.finalPath = [applicationDocumentsDirectory stringByAppendingPathComponent: self.fileName]; 
NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath];
Run Code Online (Sandbox Code Playgroud)

我检查了文件路径,我没有看到任何错误.

TYIA

cocoa-touch nsfilehandle

35
推荐指数
1
解决办法
1万
查看次数

如何在文本文件的追加模式下编写

我的应用导航基础.UItextView用于注释UIViewController.我正在写文本数据到文件.现在我需要写下附加模式,下面的代码我正在尝试,但每次用相同的文本数据写入两次,如果下一个文本数据到文件则不附加.

- (void)saveText:(id)sender
{
    [self.textview resignFirstResponder];
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [documentPaths objectAtIndex:0];
    NSString *documentTXTPath = [documentsDirectory stringByAppendingPathComponent:@"Notes.txt"];
    NSString *savedString = textview.text;
    [savedString writeToFile:documentTXTPath atomically:YES];


    NSFileHandle *myHandle = [NSFileHandle fileHandleForUpdatingAtPath:documentTXTPath ];
    [myHandle seekToEndOfFile];
    [myHandle writeData:  [savedString dataUsingEncoding:NSUTF8StringEncoding]];
    [myHandle closeFile];

}
Run Code Online (Sandbox Code Playgroud)

iphone uitextview nsfilehandle

21
推荐指数
2
解决办法
3万
查看次数

如何在Swift 2.0中正确处理NSFileHandle异常?

首先,我是iOS和Swift的新手,来自Android/Java编程背景.因此,对于我来说,尝试写入文件时捕获异常的想法是第二天性,如果缺少空间,文件权限问题或文件中可能发生的任何其他事情(根据我的经验,已发生) .我也明白,在Swift中,异常与Android/Java不同,所以这不是我在这里要求的.

我试图使用NSFileHandle附加到一个文件,如下所示:

let fileHandle: NSFileHandle? = NSFileHandle(forUpdatingAtPath: filename)
if fileHandle == nil {
    //print message showing failure
} else {
    let fileString = "print me to file"
    let data = fileString.dataUsingEncoding(NSUTF8StringEncoding)
    fileHandle?.seekToEndOfFile() 
    fileHandle?.writeData(data!)
}
Run Code Online (Sandbox Code Playgroud)

但是,函数seekToEndOfFile()writeData()函数都表明它们会抛出某种异常:

如果文件描述符已关闭或无效,如果接收器表示未连接的管道或套接字端点,文件系统上没有剩余空闲空间,或者发生任何其他写入错误,则此方法引发异常. - Apple文档writeData()

那么在Swift 2.0中处理这个问题的正确方法是什么?我读过的联系 斯威夫特语言错误处理,的try-catch斯威夫特例外,NSFileHandle写数据:异常处理,雨燕2.0的异常处理,以及如何捕捉在斯威夫特的例外,但他们都没有直接回答我的问题.我确实读过一些关于在Swift代码中使用objective-C的东西,但由于我是iOS新手,我不知道这个方法是什么,似乎无法在任何地方找到它.我还尝试了新的Swift 2.0 do-catch块,但他们没有意识到NSFileHandle方法会抛出任何类型的错误,很可能因为函数文档没有throw关键字.

我知道我可以让应用程序崩溃,如果它用完了空间或其他什么,但由于应用程序可能会在以后发布到应用商店,我不希望这样.那么我如何以Swift 2.0的方式做到这一点呢?

编辑: 这个目前只是一个只有Swift代码的项目,所以即使看起来有一种方法可以在Objective-C中做到这一点,我也不知道如何将两者混合在一起.

nsexception nsfilehandle ios swift swift2

16
推荐指数
1
解决办法
5174
查看次数

如何使用NSFileHandle的readabilityHandler检查文件结尾?

我正在使用块从a NSFileHandle(从a NSPipe)读取数据readabilityHandler:

fileHandle.readabilityHandler = ^( NSFileHandle *handle ) {
     [self processData: [handle availableData]];
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,我得到了我期望提供给我的processData方法的所有数据.问题是我需要知道何时读取了最后一块数据.如果它到达文件结尾,availableData则应返回一个空NSData实例,但问题是在EOF上不再调用可达性处理程序.

我找不到任何关于如何在EOF上获得某种通知或回调的信息.那我错过了什么?Apple是否真的在没有EOF回调的情况下提供异步读取API?

顺便说一下,我不能使用基于runloop的readInBackgroundAndNotify方法,因为我没有可用的runloop.如果我无法使用NSFileHandleAPI,我可能会直接使用调度源来执行IO.

macos cocoa objective-c nsfilehandle

13
推荐指数
1
解决办法
2042
查看次数

使用NSFileHandle覆盖数据

使用NSFileHandle,使用truncateFileAtOffset从文件末尾删除n个字符非常容易.

-(void)removeCharacters:(int)numberOfCharacters fromEndOfFile:(NSFileHandle*)fileHandle {
    unsigned long long fileLength = [fileHandle seekToEndOfFile];
    [fileHandle truncateFileAtOffset:fileLength - numberOfCharacters];
}
Run Code Online (Sandbox Code Playgroud)

但是,如果不必将所有剩余数据复制到内存中,覆盖文件然后将剩余数据写回文件,则无法从文件前面删除字符.

-(void)removeCharacters:(int)numberOfCharacters fromBeginningOfFile:(NSFileHandle*)fileHandle {
    [fileHandle seekToFileOffset:numberOfCharacters];

    NSData *remainingData = [fileHandle readDataToEndOfFile];
    [fileHandle truncateFileAtOffset:0];
    [fileHandle writeData:remainingData];
}
Run Code Online (Sandbox Code Playgroud)

此代码有效,但将成为大文件的责任.我错过了什么?

理想情况下,我希望能够执行replaceCharactersInRange:withData:

nsfilehandle ios

12
推荐指数
1
解决办法
1819
查看次数

使用NSFileHandle writedata函数时,我无法捕获"设备上没有剩余空间"异常

我曾经NSFileHandle把writedata写成文件.

NSFilehandle *handle = [NSFileHandle fileHandleForWritingAtPath:@"path/of/file"];

@try {
    [handle writedata:data];
} @catch (NSException *e) {
    // when exception occur, never got here 
     NSLog(@"%@", e);
}
Run Code Online (Sandbox Code Playgroud)

当我的设备磁盘空间已满时,调用writedata将失败.但我无法抓住异常.

我的程序日志信息:

2014-05-23 16:17:24.435 mytest[12919:3203] An uncaught exception was raised
2014-05-23 16:17:24.435 mytest[12919:3203] *** -[NSConcreteFileHandle writeData:]:
      No space left on device
2014-05-23 16:17:24.436 mytest[12919:3203] (
0 CoreFoundation 0x00007fff8fae725c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff8cbb3e75 objc_exception_throw + 43
2 CoreFoundation 0x00007fff8fae710c +[NSException raise:format:] + 204
3 Foundation 0x00007fff93640f31 __34-[NSConcreteFileHandle writeData:]_block_invoke + 84 …
Run Code Online (Sandbox Code Playgroud)

macos exception objective-c nsfilehandle ios

9
推荐指数
1
解决办法
1223
查看次数

Base64使用NSData块编码文件

更新4
Per Greg的建议我创建了一对图像/文本,使用100k块显示从37k图像到base64编码的输出.由于文件只有37k,所以可以说循环只迭代一次,因此没有附加任何内容.另一对使用10k块显示从相同的37k图像到base64编码的输出.由于文件是37k,循环迭代四次,并且数据被明确附加.

对这两个文件进行差异显示,在10kb块文件上有一个很大的区别,它从第214行开始,到第640行结束.

更新3
这是我的代码现在的位置.清理了一下但仍产生相同的效果:

// Read data in chunks from the original file
[originalFile seekToEndOfFile];
NSUInteger fileLength = [originalFile offsetInFile];
[originalFile seekToFileOffset:0];
NSUInteger chunkSize = 100 * 1024;
NSUInteger offset = 0;

while(offset < fileLength) {
    NSData *chunk = [originalFile readDataOfLength:chunkSize];
    offset += chunkSize;

    // Convert the chunk to a base64 encoded string and back into NSData
    NSString …

iphone base64 objective-c nsdata nsfilehandle

8
推荐指数
1
解决办法
4622
查看次数

重复使用NSFileHandleDataAvailableNotification文件,没有新数据(导致CPU使用率非常高)

我正在尝试NSTask使用Cocoa中的标准错误读取数据waitForDataInBackgroundAndNotify.以下代码确实读取了流,因此它已经部分工作了.

我遇到的问题是,有时NSFileHandleDataAvailableNotification开始重复启动(每秒数千次),根本没有新数据([data length]返回0).然后我的进程开始使用大量CPU,使机器停止运转.你们中的任何人过去曾经打过这样的事吗?提前致谢.

/**
 * Start reading from STDERR
 *
 * @private
 */

- (void)startReadingStandardError {
    NSFileHandle *fileHandle = [_task.standardError fileHandleForReading];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(errorData:)
                                                 name:NSFileHandleDataAvailableNotification
                                               object:fileHandle];
    [fileHandle waitForDataInBackgroundAndNotify];
}

/**
 * Fired whenever new data becomes available on STDERR
 *
 * @private
 */

-(void) errorData: (NSNotification *) notification
{
    NSFileHandle *fileHandle = (NSFileHandle*) [notification object];
    NSData *data = [fileHandle availableData];

    if ([data length]) {
       // consume data
    }

   [fileHandle …
Run Code Online (Sandbox Code Playgroud)

cocoa asynchronous objective-c nstask nsfilehandle

8
推荐指数
1
解决办法
1350
查看次数

如何从终端检测 FileHandle.standardInput 的文件结尾

我有一个雨燕程序,它读出FileHandle.standardInput(在Objective-C,这将是+[NSFileHandle fileHandleWithStandardInput],当它击中的输入流档案结尾应该终止阅读,但是当我运行它使用终端(在MacOS塞拉利昂)作为输入,当我按 Ctrl+D 时它不会检测到文件结尾。

这是我正在做的事情的一个简化示例。这个程序简单地从标准输入读取并将它读取的内容写入标准输出:

#!/usr/bin/swift

import Foundation

let input = FileHandle.standardInput
let output = FileHandle.standardOutput

let bufferSize = 1024

var data = input.readData(ofLength: bufferSize)
while data.count > 0 {
    output.write(data)
    data = output.readData(ofLength: bufferSize)
}
Run Code Online (Sandbox Code Playgroud)

我希望在到达文件末尾时readData(ofLength:)返回一个为零的Data对象count

当我使用重定向到标准输入的文件运行时,如下所示:

./echo.swift < foo.txt
Run Code Online (Sandbox Code Playgroud)

它写出文件并终止。

但是,如果我像这样运行它:

./echo.swift
Run Code Online (Sandbox Code Playgroud)

然后键入一些文本并按 Ctrl+D,我希望它将 Ctrl+D 视为文件结尾并终止。但它不会那样做。它只是不断地运行和呼应线条。如果我一遍又一遍地按 Ctrl+D,它最终会终止,但这不是我想要的。

改变bufferSize似乎没有帮助。如果我将其设置为1.

我怀疑我需要在stdin文件描述符或终端设备上设置某种缓冲参数,或者捕获信号或其他东西,但我不知道是什么。

我知道我可以改用 C stdio fread()API,它可以从终端正确检测文件结束条件,或者我可以使用 SwiftreadLine(_:)从标准输入中读取,而不必担心文件句柄/描述符,但我想知道是否有一种方法可以使用FileHandle原始文件描述符或原始文件描述符来执行此操作,而无需重新实现 C stdio。


更新:在花了一个小时查看 …

nsfilehandle swift

6
推荐指数
1
解决办法
1700
查看次数