导航:首页 > 文件教程 > iosfilehandle文件写入

iosfilehandle文件写入

发布时间:2023-07-15 00:56:42

『壹』 C#读写大文件,如何提速

不妨试试下面这个链接的方法
转自http://www.cnblogs.com/criedshy/archive/2010/06/13/1757826.html
C#内存映射文件代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Runtime.InteropServices;
usingSystem.IO;

namespaceTestOpenFileMap
{
publicclassFileMap
{
[StructLayout(LayoutKind.Sequential)]
internalstructSYSTEM_INFO
{
publicuintdwOemId;
publicuintdwPageSize;
;
;
;
;
publicuintdwProcessorType;
;
publicuintdwProcessorLevel;
publicuintdwProcessorRevision;
}

privateconstuintGENERIC_READ=0x80000000;
privateconstuintGENERIC_WRITE=0x40000000;
privateconstintOPEN_EXISTING=3;
privateconstintINVALID_HANDLE_VALUE=-1;
privateconstintFILE_ATTRIBUTE_NORMAL=0x80;
privateconstuintFILE_FLAG_SEQUENTIAL_SCAN=0x08000000;
privateconstuintPAGE_READWRITE=0x04;

privateconstintFILE_MAP_COPY=1;
privateconstintFILE_MAP_WRITE=2;
privateconstintFILE_MAP_READ=4;

///<summary>
///内存映射文件句柄
///</summary>
///<paramname="hFile"></param>
///<paramname="lpFileMappingAttributes"></param>
///<paramname="flProtect"></param>
///<paramname="dwMaximumSizeHigh"></param>
///<paramname="dwMaximumSizeLow"></param>
///<paramname="lpName"></param>
///<returns></returns>
[DllImport("kernel32.dll")]
(IntPtrhFile,
IntPtrlpFileMappingAttributes,uintflProtect,
uintdwMaximumSizeHigh,
uintdwMaximumSizeLow,stringlpName);
///<summary>
///内存映射文件
///</summary>
///<paramname="hFileMappingObject"></param>
///<paramname="dwDesiredAccess"></param>
///<paramname="dwFileOffsetHigh"></param>
///<paramname="dwFileOffsetLow"></param>
///<paramname="dwNumberOfBytesToMap"></param>
///<returns></returns>
[DllImport("kernel32.dll")]
(IntPtrhFileMappingObject,uint
dwDesiredAccess,uintdwFileOffsetHigh,uintdwFileOffsetLow,
uintdwNumberOfBytesToMap);

///<summary>
///撤消文件映像
///</summary>
///<paramname="lpBaseAddress"></param>
///<returns></returns>
[DllImport("kernel32.dll")]
(IntPtrlpBaseAddress);

///<summary>
///关闭内核对象句柄
///</summary>
///<paramname="hObject"></param>
///<returns></returns>
[DllImport("kernel32.dll")]
(IntPtrhObject);

///<summary>
///打开要映射的文件
///</summary>
///<paramname="lpFileName"></param>
///<paramname="dwDesiredAccess"></param>
///<paramname="dwShareMode"></param>
///<paramname="securityAttrs"></param>
///<paramname="dwCreationDisposition"></param>
///<paramname="dwFlagsAndAttributes"></param>
///<paramname="hTemplateFile"></param>
///<returns></returns>
[DllImport("kernel32.dll")]
(stringlpFileName,
uintdwDesiredAccess,FileSharedwShareMode,IntPtrsecurityAttrs,
FileModedwCreationDisposition,uintdwFlagsAndAttributes,IntPtrhTemplateFile);
///<summary>
///得到文件大小
///</summary>
///<paramname="hFile"></param>
///<paramname="highSize"></param>
///<returns></returns>
[DllImport("kernel32.dll",SetLastError=true)]
(IntPtrhFile,outuinthighSize);

///<summary>
///得到系统信息
///</summary>
///<paramname="lpSystemInfo"></param>
[DllImport("kernel32.dll",SetLastError=true)]
(refSYSTEM_INFOlpSystemInfo);

///<summary>
///使用内存文件映射得到文件内容
///</summary>
///<paramname="path">文件路径</param>
///<returns></returns>
(stringpath)
{
StringBuildersb=newStringBuilder();
IntPtrfileHandle=CreateFile(path,
GENERIC_READ|GENERIC_WRITE,FileShare.Read|FileShare.Write,
IntPtr.Zero,FileMode.Open,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,IntPtr.Zero);
if(INVALID_HANDLE_VALUE!=(int)fileHandle)
{
IntPtrmappingFileHandle=CreateFileMapping(
fileHandle,IntPtr.Zero,PAGE_READWRITE,0,0,"~MappingTemp");
if(mappingFileHandle!=IntPtr.Zero)
{
SYSTEM_INFOsystemInfo=newSYSTEM_INFO();;
GetSystemInfo(refsystemInfo);
//得到系统页分配粒度
uintallocationGranularity=systemInfo.dwAllocationGranularity;
uintfileSizeHigh=0;
//getfilesize
uintfileSize=GetFileSize(fileHandle,outfileSizeHigh);
fileSize|=(((uint)fileSizeHigh)<<32);
//关闭文件句柄
CloseHandle(fileHandle);
uintfileOffset=0;
uintblockBytes=1000*allocationGranularity;
if(fileSize<1000*allocationGranularity)
blockBytes=fileSize;
//分块读取内存,适用于几G的文件
while(fileSize>0)
{
//映射视图,得到地址
IntPtrlpbMapAddress=MapViewOfFile(mappingFileHandle,FILE_MAP_COPY|FILE_MAP_READ|FILE_MAP_WRITE,
(uint)(fileOffset>>32),(uint)(fileOffset&0xFFFFFFFF),
blockBytes);
if(lpbMapAddress==IntPtr.Zero)
{
returnsb;
}
//对映射的视图进行访问
byte[]temp=newbyte[blockBytes];
//从非托管的内存中复制内容到托管的内存中
Marshal.Copy(lpbMapAddress,temp,0,(int)blockBytes);

//用循环太慢了,文件有几M的时候就慢的要死,还是用上面的方法直接
//for(uinti=0;i<dwBlockBytes;i++)
//{
//bytevTemp=Marshal.ReadByte((IntPtr)((int)lpbMapAddress+i));
//temp[i]=vTemp;
//}

//此时用ASCII解码比较快,但有中文会有乱码,用gb2312即ANSI编码也比较快,16M的文件大概4秒就读出来了
//但用unicode解码,文件大的时候会非常慢,会现卡死的状态,不知道为什么?
//ASCIIEncodingencoding=newASCIIEncoding();
//System.Text.UnicodeEncodingencoding=newUnicodeEncoding();
//sb.Append(encoding.GetString(temp));
sb.Append(System.Text.Encoding.GetEncoding("gb2312").GetString(temp));
//撤消文件映像
UnmapViewOfFile(lpbMapAddress);
//修正参数
fileOffset+=blockBytes;
fileSize-=blockBytes;
}

//closefilemappinghandle
CloseHandle(mappingFileHandle);
}
}
returnsb;
}

}
}

『贰』 iOS 江湖救急!!!怎样将音频文件上传到服务器

http上传 把文件以body形式上传到服务器 NSFileHandle* handler = [NSFileHandle fileHandleForReadingAtPath:_fileURL];
[handler seekToFileOffset:(unsigned long long)_range.location];
NSData* body = [handler readDataOfLength:_range.length];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
[request setHTTPMethod:@"POST"];
[request setValue:@"video/mp4" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d",body.length] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"no-cache" forHTTPHeaderField:@"Cache-Control"];
[request setHTTPBody:body];

然后服务器接收body 二进制流

『叁』 iOS大文件的分片上传和断点上传

由于最近比较忙,所以一直没有写博客,现在分享一些大文件的上传的问题!断点续传和分片上传。因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况。http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件切片(分块),但这不是我们现在说的重点,我们要做的事是保证在网络中断后1G的文件已上传的那部分在下次网络连接时不必再重传。所以我们本地在上传的时候,要将大文件进行分片,比如分成1024*1024B,即将大文件分成1M的片进行上传,服务器在接收后,再将这些片合并成原始文件,这就是分片的基本原理。断点续传要求本地要记录每一片的上传的状态,我通过三个状态进行了标记(wait loading finish),当网络中断,再次连接后,从断点处进行上传。服务器通过文件名、总片数判断该文件是否已全部上传完成。

下面来说细节:

1、首先获取文件(音视频、图片)

分两种情况,一种是在相册库里直接获取,一种是调用相机。如果是通过UIImagePickerView来获取(细节不详述,网上一大堆),我们会发现当你选定一个视频的时候,会出现图1的压缩页面,最后我们的app获取的视频就是这个经过压缩后的视频(不是视频库里的原始视频,这里有个注意点,操作完该压缩视频后记得释放,系统不会帮你释放的,需要你手动来操作,下面会说到),然后通过UIImagePickerView的协议方法中的- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info获取视频的Info

fileInfo = {

= "public.movie";

= "file:///private/var/mobile/Containers/Data/Application/2AAE9E44-0E6D-4499-9AC3-93D44D8342EA/tmp/trim.F36EC46C-4219-43C8-96A7-FA7141AB64D2.MOV";

= "assets-library://asset/asset.MOV?id=DEDA9406-3223-4F87-ABB2-98FB5F5EB9C4&ext=MOV";

}

是选取文件的类型,如KUTTypeImage,KUTTypeMovie。这里注意一下movie和video的区别,一个是有声音的视频文件,一个是没有声音的视频文件,当然还有Audio是只有声音没有视频。是视频的URL(如果是相机拍摄的,那么这个就是原始拍摄得到的视频;如果是在相册库里选择的,那就是压缩之后生成的视频),注意这个URL不指向相册库,通过这个URL你可以操作这个视频如删除,拷贝等,可以获取压缩后的视频的大小。是一个指向相册的URL,官方的解释是an NSURL that references an asset in the AssetsLibrary framework,通过这个URL,你可以获取视频的所有信息,包括文件名,缩略图,时长等(通过ALAssetsLibrary里的assetsLibraryassetForURL:referenceURLresultBlock:)。

如果是相机拍摄的,注意两个保存方法:图片保存到相册:UIImageJPEGRepresentation([infovalueForKey:],(CGFloat)1.0)metadata:nilcompletionBlock: failureBlock:

高保真压缩图片的方法NSData * UIImageJPEGRepresentation ( UIImage *image, CGFloat compressionQuality)

视频保存到相册::MediaURL completionBlock:failureBlock:

到这里,我们就获取了所有需要的文件以及文件信息。下面要做的就是将文件分片。

2、将获取到的文件分片

首先,我将获取到的文件保存在这这样一个类中

@interface CNFile :NSObject

@property(nonatomic,)NSString* fileType;//image or movie

@property(nonatomic,)NSString* filePath;//文件在app中路径

@property(nonatomic,)NSString* fileName;//文件名

@property(nonatomic,assign)NSIntegerfileSize;//文件大小

@property (nonatomic,assign)NSIntegertrunks;//总片数

@property(nonatomic,)NSString* fileInfo;

@property(nonatomic,strong)UIImage* fileImage;//文件缩略图

@property(nonatomic,strong) NSMutableArray* fileArr;//标记每片的上传状态

@end

这样我们就可以对每一个CNFile对象进行操作了。

-(void)readDataWithChunk:(NSInteger)chunk file:(CNFile*)file{

总片数的获取方法:

intoffset =1024*1024;(每一片的大小是1M)

NSIntegerchunks = (file.fileSize%1024==0)?((int)(file.fileSize/1024*1024)):((int)(file.fileSize/(1024*1024) +1));

NSLog(@"chunks = %ld",(long)chunks);

将文件分片,读取每一片的数据:

NSData* data;

NSFileHandle*readHandle = [:file.filePath];

[readHandleseekToFileOffset:offset * chunk];

data = [readHandlereadDataOfLength:offset];

}

这样我们就获取了每一片要上传的数据,然后询问服务器,该片是否已经存在

(方法-(void)ifHaveData:(NSData*)data WithChunk:(NSInteger)chunk file:(CNFile*)file)

,如果存在,令chunk+1,重复上面的方法读取下一片,直到服务器不存在该片,那么上传该片数据。在这个方法中注意设置该chunk的上传状态(wait loading finish),这将关系到本地判断该文件是否已全部上传完成。

下一步就是上传的过程:

-(void)uploadData:(NSData*) data WithChunk:(NSInteger) chunk file:(CNFile*)file;

在服务器返回该片上传成功后,我们要做的事有很多:

1)先将已经成功上传的本片的flag置finish

[file.fileArrreplaceObjectAtIndex:chunk withObject:@“finish"];

2)查看是否所有片的flag都已经置finish,如果都已经finishi,说明该文件上传完成,那么删除该文件,上传下一个文件或者结束。

for(NSIntegerj =0; j

if(j == chunks || ((j == chunks -1)&&([file.fileArr[j]isEqualToString:@"finish"])))

[medeleteFile:file.filePath];

[mereadNextFile];

}

3)如果没有都finish,那么看本地下一chunk对用的flag是否是wait

NSLog(@"查看第%ld片的状态",chunk+1);

for(NSIntegeri = chunk+1;i < chunks;i++)

{

NSString* flag = [file.fileArrobjectAtIndex:i];

if([flagisEqualToString:@"wait"]) {

[mereadDataWithChunk:ifileName:fileNamefile:file];

break;

}

}

在第2、3步之间可以有一个 2.5)判断是否暂停上传

if(me.isPause ==YES)

{

//将目前读到了第几个文件的第几片保存到本地

[selfsaveProgressWithChunk:chunk file:file];

return;

}

这个操作实际上和上传过程中断网是一样的,为了断点续传,在断网或者暂停的时候,我们要将目前的进度保存起来,以便下次上传时略过前面已置finish的片。

然后还有一个问题,如果我们就这样线性的一片一片上传,实际上失去了分片上传的意义,应该结合多线程,使分片上传过程并发执行,同时上传多片,这样就提高了上传效率,并充分利用了网络带宽。

dispatch_async(dispatch_queue_t queue, ^{

[mereadDataWithChunk: chunk];

})

最后注意一下,每上传完一个视频,去设置里看看你的app占用的存储空间有没有增大哦,如果你没有处理那个生成的压缩视频,你会发现你的app的空间占用量是很大的。

站在大牛的肩膀上开发。

『肆』 怎样只复制目录结构,不复制文件

拷贝指定大小的文件

#import "SizeCopy.h"

@implementation SizeCopy

-(void)accordingByteCopy:(NSInteger)size
{
//获取桌面上的文件路径,以便拷贝
NSString *oldPath=@"/Users/scjy/Desktop/video.mp4";
//指定将要拷贝到哪里
NSString *newPath=@"/Users/scjy/Desktop/movie.mp4";
//创建文件管理者,准备创建文件
NSFileManager *fileManager=[NSFileManager defaultManager];
//判断将要创建的文件是不是已经存在
BOOL isHave=[fileManager fileExistsAtPath:newPath];
if (!isHave) {
//不存在的话,开始执行创建,并判断是不是创建成功
BOOL isSec=[fileManager createFileAtPath:newPath contents:nil attributes:nil];
if (isSec) {
NSLog(@"文件创建成功,开始复制");
}
else
{
return;
}
}

NSFileHandle *oldHandle=[NSFileHandle fileHandleForReadingAtPath:oldPath];//读取文件的handle
NSFileHandle *newHandle=[NSFileHandle fileHandleForUpdatingAtPath:newPath];//写入文件的handle

//表示文件已经读取过,指针已经移动到数据的最后一位
//NSLog(@"%ld",[oldHandle availableData].length);--有准确值
//NSLog(@"%ld",[oldHandle availableData].length);--值为0

//attributesOfItemAtPath获取文件的大小,内容等方法
NSDictionary *dictionary=[fileManager attributesOfItemAtPath:oldPath error:nil];
//返回文件的有效内容大小
NSNumber *lenNum=[dictionary valueForKey:NSFileSize];
NSInteger fileLength=[lenNum integerValue];//转成基本数据类型

NSInteger readLength=0;
BOOL isEnd=NO;

while (!isEnd) {
NSData *data=nil;

//获取剩余未拷贝文件长度
NSInteger subLegth=fileLength-readLength;

//判断是不是最后一次节点复制文件
if (subLegth<size) {
isEnd=YES;
[oldHandle readDataToEndOfFile];//读取到文件末尾
NSLog(@"拷贝完成:100%@",@"%");
}
else
{
data=[oldHandle readDataOfLength:size];//读取若干字节
readLength+=size;

//跳转到拷贝结束的文件节点
[oldHandle seekToFileOffset:readLength];

//计算拷贝比例
NSNumber *readNum=[NSNumber numberWithInteger:readLength];
NSLog(@"正在拷贝:%.3f%@",[readNum doubleValue]/[lenNum doubleValue]*100,@"%");
}

[newHandle writeData:data];//写入文件

}

[oldHandle closeFile];//关闭文件
[newHandle closeFile];
}

@end
转载〈树下茶壶〉
有点烦锁……
应该可以用简单一点的批处理完成。

阅读全文

与iosfilehandle文件写入相关的资料

热点内容
苹果硬盘数据恢复要多少钱 浏览:394
js绑定下拉框数据库数据 浏览:448
cad文件怎么复制到另一个文件里边 浏览:858
dxp钻孔文件 浏览:631
iphone大悦城换机 浏览:538
找结婚对象上什么网站 浏览:974
学生信息管理系统程序设计报告 浏览:640
微信文件怎么删除怎么恢复 浏览:407
编程程序怎么复制 浏览:467
文件更改 浏览:327
冰点文件路径 浏览:730
软件一点开文件就关闭 浏览:88
网络如何把人捧红 浏览:961
软件传输文件 浏览:184
密码记录器ios 浏览:412
两个电脑数据怎么一样 浏览:829
顺丰有什么买东西的app 浏览:377
数位板word 浏览:939
win7宽带连接出现多重网络 浏览:268
更改程序图标c语言 浏览:629

友情链接