有沒有一種很好的方法來複制一些文件或目錄(包括文件和子目錄)在Mac OS塊與目標c?每塊文件複製塊
每塊文件複製塊
回答
您可以通過創建一個NSInputStream
和NSOutputStream
並在NSRunLoop
安排將它們拷貝每塊的文件。然後,當您從輸入流獲取字節時,將它們寫入緩衝區,並在輸出流準備就緒後,將緩衝區的內容複製到其中。
@synthesize numberOfBytesTransferred = _numberOfBytesTransferred;
static const NSUInteger blockSize = 65536; // should be adjusted
- (void)startWithSourcePath:(NSString *)srcPath
destinationPath:(NSString *)dstPath
completionHandler:(void (^)(NSUInteger, NSError *))completionHandler
{
_buffer = malloc(blockSize);
_numberOfBytesTransferred = _bufferLength = _bufferOffset = 0;
_completionHandler = [completionHandler copy];
_srcStream = [[NSInputStream alloc] initWithFileAtPath:srcPath];
_dstStream = [[NSOutputStream alloc] initToFileAtPath:dstPath append:NO];
_srcStream.delegate = self;
_dstStream.delegate = self;
[_srcStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[_dstStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[_srcStream open];
[_dstStream open];
}
- (void)processStreams
{
if (_srcStream.hasBytesAvailable && ! _bufferLength)
_bufferLength = [_srcStream read:_buffer maxLength:blockSize];
if (_dstStream.hasSpaceAvailable && _bufferLength) {
NSInteger length = [_dstStream write:_buffer + _bufferOffset maxLength:_bufferLength];
_bufferOffset += length;
_bufferLength -= length;
}
if (_bufferOffset && !_bufferLength) {
[self willChangeValueForKey:@"numberOfBytesTransferred"];
_numberOfBytesTransferred += _bufferOffset;
_bufferOffset = 0;
[self didChangeValueForKey:@"numberOfBytesTransferred"];
}
if (_dstStream.hasSpaceAvailable && NSStreamStatusAtEnd == _srcStream.streamStatus) {
[_srcStream close];
[_dstStream close];
_completionHandler(_numberOfBytesTransferred, nil);
}
}
- (void)cancel
{
[_srcStream close];
[_dstStream close];
}
- (void)pause
{
_paused = YES;
}
- (void)resume
{
_paused = NO;
[self processStreams];
}
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
{
if (NSStreamEventErrorOccurred == eventCode) {
[_srcStream close];
[_dstStream close];
_completionHandler(_numberOfBytesTransferred, stream.streamError);
return;
}
if (! _paused)
[self processStreams];
}
複製一個目錄的內容將需要枚舉整個目錄的內容。您可以使用-[NSFileManager enumeratorAtPath:]
創建NSDirectoryEnumerator
的實例。
一旦你的枚舉,你叫nextObject
然後拿到文件屬性:
- 如果該文件是一個目錄,您可以創建在目標目錄
- 一個新的目錄如果該文件是一個普通的文件,您將啓動文件複製任務並等待直到完成處理程序被調用。
謝謝,但我有兩個問題。這是一個非常好的主意,每個塊複製文件?如果我用這種方式複製文件,例如FSCopyObjectAsync,複製速度如何? – Kira 2011-12-24 04:24:28
我認爲使用'FSFileOperation'可以更高效。該操作將進行預檢,因此啓動需要更長的時間。但它也可能使用一些優化來提高I/O性能,如將文件映射到內存中。 – 2011-12-24 11:08:05
如果你想分塊複製,請不要忘記,資源分叉,權限,元數據等。 – 2011-12-30 13:14:14
您可以使用-[NSFileManager copyItemAtPath:toPath:error:]
複製文件或目錄。
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *srcPath = @"/Users/nicolas/Documents/Xcode projects";
NSString *dstPath = @"/Users/nicolas/Desktop/Backup/Xcode projects";
NSError *error;
if (! [fileManager copyItemAtPath:srcPath toPath:dstPath error:&error])
NSLog(@"Copy error: %@", error);
- 1. 塊複製PDF文件
- 2. 重複,每塊
- 3. 在大塊JAVA讀取文件,每塊爲十六進制
- 4. 從模塊源複製模板文件
- 5. 複製大'ref字節'塊到文件
- 6. HDFS不復制塊
- 7. 複製內存塊
- 8. 複製內存塊
- 9. 在多模塊項目中的每個模塊複製文物特定的文件夾
- 10. 將塊常量複製到模塊中
- 11. 複製文件+文件時刪除方塊字符
- 12. 如何在Python中複製二進制文件的塊?
- 13. 讀取一個文件,每個塊的塊
- 14. Hadoop每個文件塊大小
- 15. CCMenuItemLabel - 「塊將被'複製'。」
- 16. Knitr複製塊的方法?
- 17. 複製特定的xml塊
- 18. Cloudera Manager - HDFS未複製塊
- 19. 如何複製模塊
- 20. HDFS在複製塊下
- 21. iOS - NSMutableArray和塊複製
- 22. 複製PHP代碼塊
- 23. Ansible複製模塊失敗
- 24. 使用webpack複製模塊
- 25. EXC_BAD_ACCESS複製或保留塊
- 26. HDFS塊大小和複製
- 27. 複製動態數組塊
- 28. hyperledger織物塊複製
- 29. 塊級複製和Rsync
- 30. 何時需要複製塊?
你究竟想達到什麼目的?你爲什麼要複製它塊?我們在談論什麼操作系統?蘋果系統? iOS版?還有別的嗎? – Codo 2011-12-23 11:22:54
你認爲「塊每塊」是什麼意思? – 2011-12-23 12:43:55
對不起。我們在談論MacOS。我需要暫停複製過程的能力,然後在每個下一個塊之後,我將能夠檢查標誌,然後暫停或恢復(如果它暫停)過程。 – Kira 2011-12-23 16:07:50