add .gitignore
This commit is contained in:
106
msext/QiniuSDK/Common/QNFile.m
Executable file
106
msext/QiniuSDK/Common/QNFile.m
Executable file
@@ -0,0 +1,106 @@
|
||||
//
|
||||
// QNFile.m
|
||||
// QiniuSDK
|
||||
//
|
||||
// Created by bailong on 15/7/25.
|
||||
// Copyright (c) 2015年 Qiniu. All rights reserved.
|
||||
//
|
||||
|
||||
#import "QNFile.h"
|
||||
#import "QNResponseInfo.h"
|
||||
|
||||
@interface QNFile ()
|
||||
|
||||
@property (nonatomic, readonly) NSString *filepath;
|
||||
|
||||
@property (nonatomic) NSData *data;
|
||||
|
||||
@property (readonly) int64_t fileSize;
|
||||
|
||||
@property (readonly) int64_t fileModifyTime;
|
||||
|
||||
@property (nonatomic) NSFileHandle *file;
|
||||
|
||||
@end
|
||||
|
||||
@implementation QNFile
|
||||
|
||||
- (instancetype)init:(NSString *)path
|
||||
error:(NSError *__autoreleasing *)error {
|
||||
if (self = [super init]) {
|
||||
_filepath = path;
|
||||
NSError *error2 = nil;
|
||||
NSDictionary *fileAttr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:&error2];
|
||||
if (error2 != nil) {
|
||||
if (error != nil) {
|
||||
*error = error2;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
_fileSize = [fileAttr fileSize];
|
||||
NSDate *modifyTime = fileAttr[NSFileModificationDate];
|
||||
int64_t t = 0;
|
||||
if (modifyTime != nil) {
|
||||
t = [modifyTime timeIntervalSince1970];
|
||||
}
|
||||
_fileModifyTime = t;
|
||||
NSFileHandle *f = nil;
|
||||
NSData *d = nil;
|
||||
//[NSData dataWithContentsOfFile:filePath options:NSDataReadingMappedIfSafe error:&error] 不能用在大于 200M的文件上,改用filehandle
|
||||
// 参见 https://issues.apache.org/jira/browse/CB-5790
|
||||
if (_fileSize > 16 * 1024 * 1024) {
|
||||
f = [NSFileHandle fileHandleForReadingAtPath:path];
|
||||
if (f == nil) {
|
||||
if (error != nil) {
|
||||
*error = [[NSError alloc] initWithDomain:path code:kQNFileError userInfo:nil];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
} else {
|
||||
d = [NSData dataWithContentsOfFile:path options:NSDataReadingMappedIfSafe error:&error2];
|
||||
if (error2 != nil) {
|
||||
if (error != nil) {
|
||||
*error = error2;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
}
|
||||
_file = f;
|
||||
_data = d;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSData *)read:(long)offset
|
||||
size:(long)size {
|
||||
if (_data != nil) {
|
||||
return [_data subdataWithRange:NSMakeRange(offset, (unsigned int)size)];
|
||||
}
|
||||
[_file seekToFileOffset:offset];
|
||||
return [_file readDataOfLength:size];
|
||||
}
|
||||
|
||||
- (NSData *)readAll {
|
||||
return [self read:0 size:(long)_fileSize];
|
||||
}
|
||||
|
||||
- (void)close {
|
||||
if (_file != nil) {
|
||||
[_file closeFile];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *)path {
|
||||
return _filepath;
|
||||
}
|
||||
|
||||
- (int64_t)modifyTime {
|
||||
return _fileModifyTime;
|
||||
}
|
||||
|
||||
- (int64_t)size {
|
||||
return _fileSize;
|
||||
}
|
||||
|
||||
@end
|
||||
Reference in New Issue
Block a user