這一章算是一個重要內容了,涉及到實際功能了
文件的上傳和下載:上傳就是指將本地的文件上傳到蘋果設備上的文件系統中,下載則相反。
首先需要注意的地方:
本地的路徑形式,如:"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 success
FILE* 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 關閉文件
同樣是分塊讀取的
大家如果有什麼不懂的,可以留言!