ios助手开发系列(六):文件操作系列3 - 文件上传和文件下载

来源:互联网 发布:二建题库软件 编辑:程序博客网 时间:2024/05/10 11:58

这一章算是一个重要内容了,涉及到实际功能了大笑

 

文件的上传和下载:上传就是指将本地的文件上传到苹果设备上的文件系统中,下载则相反。

首先需要注意的地方:

本地的路径形式,如:"D:\\testFolder\\my.txt"

设备的路径形式,如:"/Books/test.pdf"

 

不多说,先直接上代码:

文件上传:

#define SECTIONSIZE (1024*512)
BOOL IOSFileUpload(HANDLE afcHandle,char* fromPath,char* toPath){FILE *file = fopen(fromPath, "rb");long filesize = 0;fseek(file,0,SEEK_END);filesize = ftell(file);long partCount = 0;long leftSize = filesize % SECTIONSIZE;partCount = filesize / SECTIONSIZE;partCount += leftSize>0?1:0;ULONGLONG fileHandle;UINT ret = 0;ret = iTunesApi::AFCFileRefOpen(afcHandle,toPath,AFC_FOPEN_WRONLY,0,&fileHandle);long pos = 0;fseek(file,pos,SEEK_SET);//if(partCount>1){do{char* buf = new char[SECTIONSIZE];fread(buf, 1,SECTIONSIZE, file );pos+= SECTIONSIZE;fseek(file,pos,SEEK_SET);ret = iTunesApi::AFCFileRefWrite(afcHandle,fileHandle,buf,SECTIONSIZE);delete buf;}while((filesize/(pos+SECTIONSIZE))>0);}if (leftSize>0){char* buf = new char[leftSize];fread(buf, 1,leftSize, file);pos+= leftSize;fseek(file,pos,SEEK_SET);ret = iTunesApi::AFCFileRefWrite(afcHandle,fileHandle,buf,leftSize);delete buf;}//ret = iTunesApi::AFCFileRefClose(afcHandle,fileHandle);return TRUE;}

解释:

本来代码可以很短,但你上传一个文件,总不至于一下子就上传上去吧?一般会分块

SECTIONSIZE就是每块的大小,可以自行设定

需要用到的API函数:

AFCFileRefOpen 打开设备文件句柄

AFCFileRefWrite 往打开的文件里面写内容

AFCFileRefClose 关闭文件句柄

其中afcHandle就是上一章中讲到的AFC服务句柄,在做上传操作之前需要开启此服务

有兴趣的朋友可以在里面加一些参数什么的,可以做有进度的文件上传,当然我这里已经做好了,只是避免代码太长,所以删减了。。。

 

文件下载:

BOOL IOSFileDownload(HANDLE afcHandle,char* fromPath,char* toPath){ULONGLONG fileHandle;UINT ret = 0;long filesize = 0;IOSFileInfo fileinfo;long pos = 0;long partCount = 0;long leftSize = 0;UINT buflen = 0;partCount = filesize / SECTIONSIZE;partCount += leftSize>0?1:0;HANDLE tmpHandle;ret = iTunesApi::AFCDirectoryOpen(afcHandle,fromPath,&tmpHandle);//0表示是文件夹,其它均表示非文件夹if (ret){IOSGetPathInformation(afcHandle,fromPath,&fileinfo);filesize = fileinfo.filesize;leftSize = filesize % SECTIONSIZE;partCount = filesize / SECTIONSIZE;partCount += leftSize>0?1:0;ret = iTunesApi::AFCFileRefOpen(afcHandle,fromPath,AFC_FOPEN_RDONLY,0,&fileHandle);//0 successFILE* file = fopen(toPath,"rb");if (file){fclose(file);remove(toPath);}file = fopen(toPath,"wb");if (!file){return FALSE;}fseek(file,0,SEEK_SET);if(partCount>1){do{buflen = SECTIONSIZE;char* buf = new char[SECTIONSIZE];ret = iTunesApi::AFCFileRefRead(afcHandle,fileHandle,buf,&buflen);fwrite(buf,SECTIONSIZE,1,file);pos+= SECTIONSIZE;delete buf;}while((filesize/(pos+SECTIONSIZE))>0);}if (leftSize>0){buflen = leftSize;char* buf = new char[leftSize];ret = iTunesApi::AFCFileRefRead(afcHandle,fileHandle,buf,&buflen);fwrite(buf,leftSize,1,file);pos+= SECTIONSIZE;delete buf;}ret = iTunesApi::AFCFileRefClose(afcHandle,fileHandle);fclose(file);}return TRUE;

解释:

IOSGetPathInformation函数是我自定义的一个函数,是获取一个设备上文件的信息的函数,这里主要是为了获取设备上文件的长度,具体可参照文件系列的第一章;

需要用到的API函数:

AFCDirectoryOpen 判断是否为文件夹

AFCFileRefOpen 打开设备上的文件

AFCFileRefRead 读取内容

AFCFileRefClose 关闭文件

同样是分块读取的

 

大家如果有什么不懂的,可以留言!

原创粉丝点击