ios助手開發系列(六):文件操作系列3 - 文件上傳和文件下載

這一章算是一個重要內容了,涉及到實際功能了大笑

 

文件的上傳和下載:上傳就是指將本地的文件上傳到蘋果設備上的文件系統中,下載則相反。

首先需要注意的地方:

本地的路徑形式,如:"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 關閉文件

同樣是分塊讀取的

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章