private long taskId = 0; //本地下载任务的 ID #endregion Fields #region Constructors public MultiThreadUploader(BaiduPCS pcs, string from, string to, string workfolder, int threadCount) : base(pcs, from, to) { this.WorkFolder = workfolder; this.ThreadCount = threadCount; }
private long taskId = 0; //本地下载任务的 ID #endregion Fields #region Constructors public MultiThreadDownloader(BaiduPCS pcs, PcsFileInfo from, string to, string workfolder, int threadCount, int minSliceSize = MIN_SLICE_SIZE) : base(pcs, from, to) { this.WorkFolder = workfolder; this.ThreadCount = threadCount; this.MinSliceSize = minSliceSize; }
static bool OnGetCaptcha(BaiduPCS sender, byte[] imgBytes, out string captcha, object userdata) { captcha = null; frmCaptcha frm = new frmCaptcha(imgBytes); frm.TopMost = true; if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK) { captcha = frm.Captcha; return true; } return false; }
/// <summary> /// 获取下载速度 /// </summary> /// <param name="pcs"></param> /// <returns>返回下载速度</returns> public static double pcs_speed_download(BaiduPCS pcs) { return NativeMethods.pcs_speed_download(pcs.Handle); }
/// <summary> /// 配置 pcs 对象 /// </summary> /// <param name="pcs"></param> /// <param name="opt"></param> /// <param name="value"></param> /// <returns>成功后返回 PCS_OK,失败则返回错误编号</returns> public static PcsRes pcs_setopt(BaiduPCS pcs, PcsOption opt, object value) { PcsRes r = PcsRes.PCS_OK; switch (opt) { /* 值为以0结尾的C格式字符串 */ case PcsOption.PCS_OPTION_USERNAME: { IntPtr v = NativeUtils.utf8_str_ptr((string)value); r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, v); NativeUtils.free_str_ptr(v); } break; /* 值为以0结尾的C格式字符串 */ case PcsOption.PCS_OPTION_PASSWORD: { IntPtr v = NativeUtils.utf8_str_ptr((string)value); r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, v); NativeUtils.free_str_ptr(v); } break; /* 值为PcsGetCaptcha类型的函数 */ case PcsOption.PCS_OPTION_CAPTCHA_FUNCTION: { if (value != null) { IntPtr v = Marshal.GetFunctionPointerForDelegate(pcs._onGetCaptcha); r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, v); } else { r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, IntPtr.Zero); } pcs._OnGetCaptcha = (GetCaptchaFunction)value; } break; /* Pcs本身不使用该值,仅原样传递到PcsGetCaptcha函数中 */ case PcsOption.PCS_OPTION_CAPTCHA_FUNCTION_DATA: pcs.GetCaptchaUserData = value; NativeMethods.pcs_setopt(pcs.Handle, (int)opt, IntPtr.Zero); break; /* 值为PcsHttpWriteFunction类型的函数 */ case PcsOption.PCS_OPTION_DOWNLOAD_WRITE_FUNCTION: { if (value != null) { IntPtr v = Marshal.GetFunctionPointerForDelegate(pcs._onHttpWrite); r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, v); } else { r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, IntPtr.Zero); } pcs._OnHttpWrite = (WriteBlockFunction)value; } break; /* Pcs本身不使用该值,仅原样传递到PcsHttpWriteFunction函数中 */ case PcsOption.PCS_OPTION_DOWNLOAD_WRITE_FUNCTION_DATA: pcs.WriteUserData = value; NativeMethods.pcs_setopt(pcs.Handle, (int)opt, IntPtr.Zero); break; /* 值为PcsHttpResponseFunction类型的函数 */ case PcsOption.PCS_OPTION_HTTP_RESPONSE_FUNCTION: { if (value != null) { IntPtr v = Marshal.GetFunctionPointerForDelegate(pcs._onHttpResponse); r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, v); } else { r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, IntPtr.Zero); } pcs._OnHttpResponse = (OnHttpResponseFunction)value; } break; /* Pcs本身不使用该值,仅原样传递到PcsHttpResponseFunction函数中 */ case PcsOption.PCS_OPTION_HTTP_RESPONSE_FUNCTION_DATE: pcs.ResponseUserData = value; NativeMethods.pcs_setopt(pcs.Handle, (int)opt, IntPtr.Zero); break; /* 值为PcsHttpProgressCallback类型的函数 */ case PcsOption.PCS_OPTION_PROGRESS_FUNCTION: { if (value != null) { IntPtr v = Marshal.GetFunctionPointerForDelegate(pcs._onHttpProgress); r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, v); } else { r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, IntPtr.Zero); } pcs._OnHttpProgress = (OnHttpProgressFunction)value; } break; /* Pcs本身不使用该值,仅原样传递到PcsHttpProgressCallback函数中 */ case PcsOption.PCS_OPTION_PROGRESS_FUNCTION_DATE: pcs.ProgressUserData = value; NativeMethods.pcs_setopt(pcs.Handle, (int)opt, IntPtr.Zero); break; /* 设置是否启用下载或上传进度,值为PcsBool类型 */ case PcsOption.PCS_OPTION_PROGRESS: { pcs._ProgressEnabled = (bool)value; IntPtr v = ((bool)value) ? NativeUtils.IntPtrAdd(IntPtr.Zero, 1) : IntPtr.Zero; r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, v); } break; /* 设置USAGE,值为char类型指针 */ case PcsOption.PCS_OPTION_USAGE: { IntPtr v = NativeUtils.str_ptr((string)value); r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, v); NativeUtils.free_str_ptr(v); pcs._UserAgent = (string)value; } break; /*设置整个请求的超时时间,值为int类型*/ case PcsOption.PCS_OPTION_TIMEOUT: { IntPtr v = NativeUtils.IntPtrAdd(IntPtr.Zero, (int)value); r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, v); } break; /*设置连接前的等待时间,值为int类型*/ case PcsOption.PCS_OPTION_CONNECTTIMEOUT: { IntPtr v = NativeUtils.IntPtrAdd(IntPtr.Zero, (int)value); r = (PcsRes)NativeMethods.pcs_setopt(pcs.Handle, (int)opt, v); } break; default: r = PcsRes.PCS_FAIL; break; } return r; }
/// <summary> /// 获取最后一次请求的原始数据。 /// </summary> /// <param name="pcs"></param> /// <param name="size">用于接收原始数据的长度</param> /// <param name="encode">用于接收原始数据的编码</param> /// <returns>返回原始数据</returns> public static string pcs_req_rawdata(BaiduPCS pcs, out int size, out string encode) { size = 0; encode = null; IntPtr sizePtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int))); IntPtr encodePtrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr))); IntPtr sPtr = NativeMethods.pcs_req_rawdata(pcs.Handle, sizePtr, encodePtrPtr); string html = null; if (sPtr != IntPtr.Zero) html = NativeUtils.utf8_str(sPtr); size = Marshal.ReadInt32(sizePtr); IntPtr encodePtr = Marshal.ReadIntPtr(encodePtrPtr); if (encodePtr != IntPtr.Zero) encode = NativeUtils.str(encodePtr); Marshal.FreeHGlobal(sizePtr); Marshal.FreeHGlobal(encodePtrPtr); return html; }
/// <summary> /// 快速上传 /// </summary> /// <param name="pcs"></param> /// <param name="topath">网盘文件</param> /// <param name="filesize">本地文件的字节大小</param> /// <param name="file_md5">文件的md5值</param> /// <param name="slice_md5">验证文件的分片的md5值</param> /// <param name="overwrite">如果 topath 已经存在,是否覆盖。true - 覆盖;false - 自动重命名</param> /// <returns>返回上传的文件的元数据</returns> public static PcsFileInfo pcs_rapid_upload_r(BaiduPCS pcs, string topath, long filesize, string file_md5, string slice_md5, bool overwrite = false) { IntPtr remotePtr = NativeUtils.utf8_str_ptr(topath); IntPtr fileMd5Ptr = Marshal.AllocHGlobal(36); IntPtr sliceMd5Ptr = Marshal.AllocHGlobal(36); NativeUtils.str_set(fileMd5Ptr, file_md5); NativeUtils.str_set(sliceMd5Ptr, slice_md5); IntPtr fiptr = NativeMethods.pcs_rapid_upload_r(pcs.Handle, remotePtr, overwrite ? NativeConst.True : NativeConst.False, filesize, fileMd5Ptr, sliceMd5Ptr); file_md5 = NativeUtils.utf8_str(fileMd5Ptr); slice_md5 = NativeUtils.utf8_str(sliceMd5Ptr); NativeUtils.free_str_ptr(remotePtr); Marshal.FreeHGlobal(fileMd5Ptr); Marshal.FreeHGlobal(sliceMd5Ptr); if (fiptr == IntPtr.Zero) return new PcsFileInfo(); NativePcsFileInfo nfi = (NativePcsFileInfo)Marshal.PtrToStructure(fiptr, typeof(NativePcsFileInfo)); PcsFileInfo fi = new PcsFileInfo(nfi); NativeMethods.pcs_fileinfo_destroy(fiptr); return fi; }
/// <summary> /// 获取网盘配额 /// </summary> /// <param name="pcs"></param> /// <param name="quota">用于接收总大小</param> /// <param name="used">用于接收已使用值</param> /// <returns>成功后返回PCS_OK,失败则返回错误编号</returns> public static PcsRes pcs_quota(BaiduPCS pcs, out long quota, out long used) { IntPtr quotaPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(long))); IntPtr usedPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(long))); Marshal.Copy(NativeConst.ZERO_MATRIX_8X8, 0, quotaPtr, Marshal.SizeOf(typeof(long))); Marshal.Copy(NativeConst.ZERO_MATRIX_8X8, 0, usedPtr, Marshal.SizeOf(typeof(long))); PcsRes r = (PcsRes)NativeMethods.pcs_quota(pcs.Handle, quotaPtr, usedPtr); if (r == PcsRes.PCS_OK) { quota = Marshal.ReadInt64(quotaPtr); used = Marshal.ReadInt64(usedPtr); } else { quota = 0; used = 0; } return r; }
/// <summary> /// 获取文件或目录的元信息,该方法通过pcs_search实现。 /// </summary> /// <param name="pcs"></param> /// <param name="path">待获取的文件或目录,地址需写全,如/temp, /temp/file.txt</param> /// <returns>返回文件元数据</returns> public static PcsFileInfo pcs_meta(BaiduPCS pcs, string path) { IntPtr pathPtr = NativeUtils.utf8_str_ptr(path); IntPtr fiptr = NativeMethods.pcs_meta(pcs.Handle, pathPtr); NativeUtils.free_str_ptr(pathPtr); if (fiptr == IntPtr.Zero) return new PcsFileInfo(); NativePcsFileInfo nfi = (NativePcsFileInfo)Marshal.PtrToStructure(fiptr, typeof(NativePcsFileInfo)); PcsFileInfo fi = new PcsFileInfo(nfi); NativeMethods.pcs_fileinfo_destroy(fiptr); return fi; }
/// <summary> /// 获取Cookie 数据。 /// </summary> /// <param name="pcs"></param> /// <returns>返回 Cookie 数据</returns> public static string pcs_cookie_data(BaiduPCS pcs) { IntPtr sPtr = NativeMethods.pcs_cookie_data(pcs.Handle); string cookie = null; if (sPtr != IntPtr.Zero) { cookie = NativeUtils.str(sPtr); NativeUtils.pcs_free(sPtr); } return cookie; }
/// <summary> /// 复制 src 的用户信息到 dst 中,因此 dst 将使用和 src 一样的用户身份执行操作。 /// </summary> /// <param name="dst">复制到该对象中</param> /// <param name="src">复制源</param> public static void pcs_clone_userinfo(BaiduPCS dst, BaiduPCS src) { NativeMethods.pcs_clone_userinfo(dst.Handle, src.Handle); }
/// <summary> /// 清除错误消息 /// </summary> /// <param name="pcs"></param> public static void pcs_clear_errmsg(BaiduPCS pcs) { NativeMethods.pcs_clear_errmsg(pcs.Handle); }
/// <summary> /// 不下载文件,直接获取文本文件的内容 /// </summary> /// <param name="pcs"></param> /// <param name="path">待获取的文件或目录,地址需写全,如/temp, /temp/file.txt</param> /// <returns>返回文本内容</returns> public static string pcs_cat(BaiduPCS pcs, string path) { uint sz = 0; IntPtr pathPtr = NativeUtils.utf8_str_ptr(path); IntPtr sp = NativeMethods.pcs_cat(pcs.Handle, pathPtr, ref sz); NativeUtils.free_str_ptr(pathPtr); if (sp == IntPtr.Zero) return null; return NativeUtils.str(sp); }
/// <summary> /// 把 from 中的用户信息复制到本对象中,因此本对象具有和 from 一样的用户身份。 /// </summary> /// <param name="from"></param> public void cloneUserInfo(BaiduPCS from) { pcs_clone_userinfo(this, from); }
/// <summary> /// 上传分片文件 /// </summary> /// <param name="pcs"></param> /// <param name="read_func">读取该分片文件的方法</param> /// <param name="userdata"></param> /// <param name="content_size">总共需要上传的大小</param> /// <param name="maxspeed">最大上传速度,0 为不限制上传速度。</param> /// <returns>返回上传的分片文件的元数据 </returns> public static PcsFileInfo pcs_upload_slicefile(BaiduPCS pcs, OnReadBlockFunction read_func, object userdata, uint content_size, long maxspeed = 0) { UserState state = new UserState() { onReadSlice = read_func, userData = userdata }; string key = saveState(state); IntPtr keyPtr = NativeUtils.str_ptr(key); IntPtr fiptr = NativeMethods.pcs_upload_slicefile(pcs.Handle, pcs._onReadBlock, keyPtr, content_size, maxspeed); NativeUtils.free_str_ptr(keyPtr); removeState(key); if (fiptr == IntPtr.Zero) return new PcsFileInfo(); NativePcsFileInfo nfi = (NativePcsFileInfo)Marshal.PtrToStructure(fiptr, typeof(NativePcsFileInfo)); PcsFileInfo fi = new PcsFileInfo(nfi); NativeMethods.pcs_fileinfo_destroy(fiptr); return fi; }
/// <summary> /// 计算文件的MD5值,仅从文件offset偏移处开始计算,并仅计算 length 长度的数据。 /// </summary> /// <param name="pcs"></param> /// <param name="local_path">本地文件路径</param> /// <param name="offset">仅从文件offset偏移处开始计算</param> /// <param name="length">仅计算 length 长度的数据</param> /// <param name="md5">用于接收计算结果</param> /// <returns>返回是否计算成功。</returns> public static bool pcs_md5_file_slice(BaiduPCS pcs, string local_path, long offset, long length, out string md5) { IntPtr localPtr = NativeUtils.str_ptr(local_path); IntPtr md5Ptr = Marshal.AllocHGlobal(36); Marshal.Copy(NativeConst.ZERO_MATRIX_8X8, 0, md5Ptr, 36); /* need fix? */ bool r = NativeMethods.pcs_md5_file_slice(pcs.Handle, localPtr, offset, length, md5Ptr) != NativeConst.False; NativeUtils.free_str_ptr(localPtr); if (r) md5 = NativeUtils.utf8_str(md5Ptr); else md5 = string.Empty; Marshal.FreeHGlobal(md5Ptr); return r; }
/// <summary> /// 计算 MD5 值 /// </summary> /// <param name="pcs"></param> /// <param name="read_func">读取块类容的函数</param> /// <param name="userdata"></param> /// <param name="md5">用于接收计算结果</param> /// <returns>返回是否计算成功。</returns> public static bool pcs_md5_s(BaiduPCS pcs, OnReadBlockFunction read_func, object userdata, out string md5) { UserState state = new UserState() { onReadSlice = read_func, userData = userdata }; string key = saveState(state); IntPtr keyPtr = NativeUtils.str_ptr(key); IntPtr md5Ptr = Marshal.AllocHGlobal(36); Marshal.Copy(NativeConst.ZERO_MATRIX_8X8, 0, md5Ptr, 36); /* need fix? */ bool r = NativeMethods.pcs_md5_s(pcs.Handle, pcs._onReadBlock, keyPtr, md5Ptr) != NativeConst.False; NativeUtils.free_str_ptr(keyPtr); removeState(key); if (r) md5 = NativeUtils.utf8_str(md5Ptr); else md5 = string.Empty; Marshal.FreeHGlobal(md5Ptr); return r; }
/// <summary> /// 创建一个新对象。 /// </summary> /// <param name="cookieFileName"></param> /// <returns>成功返回新对象,失败返回 null</returns> public static BaiduPCS pcs_create(string cookieFileName) { IntPtr cookieFileNamePtr = NativeUtils.str_ptr(cookieFileName); IntPtr pcsPtr = NativeMethods.pcs_create(cookieFileNamePtr); NativeUtils.free_str_ptr(cookieFileNamePtr); if (pcsPtr == IntPtr.Zero) return null; BaiduPCS pcs = new BaiduPCS(pcsPtr, cookieFileName); pcs_setopt(pcs, PcsOption.PCS_OPTION_USAGE, USAGE); pcs_setopt(pcs, PcsOption.PCS_OPTION_CONNECTTIMEOUT, 10); //pcs_setopt(pcs, PcsOption.PCS_OPTION_TIMEOUT, 60); //pcs_setopt(pcs, PcsOption.PCS_OPTION_CAPTCHA_FUNCTION, pcs._onGetCaptcha); //pcs_setopt(pcs, PcsOption.PCS_OPTION_PROGRESS_FUNCTION, pcs._onHttpProgress); //pcs_setopt(pcs, PcsOption.PCS_OPTION_PROGRESS, false); return pcs; }
/// <summary> /// 创建一个目录 /// </summary> /// <param name="pcs"></param> /// <param name="path">待创建的目录,地址需写全,如/temp</param> /// <returns>成功后返回PCS_OK,失败则返回错误编号</returns> public static PcsRes pcs_mkdir(BaiduPCS pcs, string path) { IntPtr pathPtr = NativeUtils.utf8_str_ptr(path); PcsRes r = (PcsRes)NativeMethods.pcs_mkdir(pcs.Handle, pathPtr); NativeUtils.free_str_ptr(pathPtr); return r; }
/// <summary> /// 合并分片文件 /// </summary> /// <param name="pcs"></param> /// <param name="topath">合并后产生的文件路径,必须写全。</param> /// <param name="block_list">待合并的分片列表,每一个都是上传分片文件时返回的 md5 值</param> /// <param name="overwrite">如果 topath 已经存在,是否覆盖</param> /// <returns>返回合并后的文件的元数据</returns> public static PcsFileInfo pcs_create_superfile(BaiduPCS pcs, string topath, string[] block_list, bool overwrite = false) { IntPtr pathPtr = NativeUtils.utf8_str_ptr(topath); IntPtr slPtr = NativeUtils.slist_ptr(block_list); IntPtr fiptr = NativeMethods.pcs_create_superfile(pcs.Handle, pathPtr, overwrite ? NativeConst.True : NativeConst.False, slPtr); NativeUtils.free_str_ptr(pathPtr); NativeUtils.free_slist_ptr(slPtr); if (fiptr == IntPtr.Zero) return new PcsFileInfo(); NativePcsFileInfo nfi = (NativePcsFileInfo)Marshal.PtrToStructure(fiptr, typeof(NativePcsFileInfo)); PcsFileInfo fi = new PcsFileInfo(nfi); NativeMethods.pcs_fileinfo_destroy(fiptr); return fi; }
/// <summary> /// 快速上传 /// </summary> /// <param name="pcs"></param> /// <param name="topath">网盘文件</param> /// <param name="local_filename">本地文件</param> /// <param name="file_md5">文件的md5值</param> /// <param name="slice_md5">验证文件的分片的md5值</param> /// <param name="overwrite">如果 topath 已经存在,是否覆盖。true - 覆盖;false - 自动重命名</param> /// <returns>返回上传的文件的元数据</returns> public static PcsFileInfo pcs_rapid_upload(BaiduPCS pcs, string topath, string local_filename, ref string file_md5, ref string slice_md5, bool overwrite = false) { IntPtr remotePtr = NativeUtils.utf8_str_ptr(topath); IntPtr localPtr = NativeUtils.str_ptr(local_filename); IntPtr fileMd5Ptr = Marshal.AllocHGlobal(36); IntPtr sliceMd5Ptr = Marshal.AllocHGlobal(36); if (!string.IsNullOrEmpty(file_md5) && file_md5.Length == 32) NativeUtils.str_set(fileMd5Ptr, file_md5); else Marshal.Copy(NativeConst.ZERO_MATRIX_8X8, 0, fileMd5Ptr, 36); /* need fix? */ if (!string.IsNullOrEmpty(slice_md5) && slice_md5.Length == 32) NativeUtils.str_set(sliceMd5Ptr, slice_md5); else Marshal.Copy(NativeConst.ZERO_MATRIX_8X8, 0, sliceMd5Ptr, 36); /* need fix? */ IntPtr fiptr = NativeMethods.pcs_rapid_upload(pcs.Handle, remotePtr, overwrite ? NativeConst.True : NativeConst.False, localPtr, fileMd5Ptr, sliceMd5Ptr); file_md5 = NativeUtils.utf8_str(fileMd5Ptr); slice_md5 = NativeUtils.utf8_str(sliceMd5Ptr); NativeUtils.free_str_ptr(remotePtr); NativeUtils.free_str_ptr(localPtr); Marshal.FreeHGlobal(fileMd5Ptr); Marshal.FreeHGlobal(sliceMd5Ptr); if (fiptr == IntPtr.Zero) return new PcsFileInfo(); NativePcsFileInfo nfi = (NativePcsFileInfo)Marshal.PtrToStructure(fiptr, typeof(NativePcsFileInfo)); PcsFileInfo fi = new PcsFileInfo(nfi); NativeMethods.pcs_fileinfo_destroy(fiptr); return fi; }
/// <summary> /// 下载文件。 /// 必须指定写入下载内容的函数,可通过 PCS_OPTION_DOWNLOAD_WRITE_FUNCTION 选项来指定。 /// 每当下载到一部分数据时,将触发 PcsHttpWriteFunction 事件,用于写文件。 /// </summary> /// <param name="pcs"></param> /// <param name="path">待下载的文件,地址需写全,如/temp/file.txt</param> /// <param name="max_speed">下载时的最大速度,0 表示不限速</param> /// <param name="resume_from">从文件的哪一个位置开始下载,断点续传时,已经下载的部分不需要再次下载。</param> /// <param name="max_length">从 resume_from 位置开始,一共下载多少字节的数据。0 表示下载到结尾。</param> /// <returns>成功后返回PCS_OK,失败则返回错误编号</returns> public static PcsRes pcs_download(BaiduPCS pcs, string path, long max_speed, long resume_from, long max_length) { IntPtr pathPtr = NativeUtils.utf8_str_ptr(path); PcsRes r = (PcsRes)NativeMethods.pcs_download(pcs.Handle, pathPtr, max_speed, resume_from, max_length); NativeUtils.free_str_ptr(pathPtr); return r; }
/// <summary> /// 重命名多个文件 /// </summary> /// <param name="pcs"></param> /// <param name="files">每项中的str1为待重命名的文件,路径需写全(如:/temp/file.txt);str2为新的名字,仅需文件名,例如 newfile.txt,写全路径则重命名失败。如需要移动请用pcs_move()方法。</param> /// <returns>返回每一项的删除情况,成功则其 error = 0,否则为错误编码</returns> public static PcsPanApiRes pcs_rename(BaiduPCS pcs, SPair[] files) { if (files == null || files.Length == 0) return new PcsPanApiRes() { error = -1 }; IntPtr listPtr = NativeUtils.slist2_ptr(files); if (listPtr == IntPtr.Zero) return new PcsPanApiRes() { error = -1 }; IntPtr r = NativeMethods.pcs_rename(pcs.Handle, listPtr); NativeUtils.free_slist2_ptr(listPtr); if (r == IntPtr.Zero) return new PcsPanApiRes() { error = -1 }; PcsPanApiRes res = NativeUtils.GetPcsPanApiResFromPtr(r); NativeMethods.pcs_pan_api_res_destroy(r); return res; }
/// <summary> /// 获取待下载文件的字节大小 /// </summary> /// <param name="pcs"></param> /// <param name="path">待下载的文件,地址需写全,如/temp/file.txt</param> /// <returns>返回文件的大小</returns> public static long pcs_get_download_filesize(BaiduPCS pcs, string path) { IntPtr pathPtr = NativeUtils.utf8_str_ptr(path); long r = NativeMethods.pcs_get_download_filesize(pcs.Handle, pathPtr); NativeUtils.free_str_ptr(pathPtr); return r; }
/// <summary> /// 在 dir 指定的文件夹中搜索关键字 key /// </summary> /// <param name="pcs"></param> /// <param name="dir">待搜索的目录,地址需写全,如/temp</param> /// <param name="key">关键词</param> /// <param name="recursion">是否递归搜索其子目录</param> /// <returns>返回文件列表。可根据 pcs_strerror() 的返回值判断是否出错。</returns> public static PcsFileInfo[] pcs_search(BaiduPCS pcs, string dir, string key, bool recursion = false) { IntPtr dirPtr = NativeUtils.utf8_str_ptr(dir); IntPtr keyPtr = NativeUtils.utf8_str_ptr(key); IntPtr listPtr = NativeMethods.pcs_search(pcs.Handle, dirPtr, keyPtr, recursion ? NativeConst.True : NativeConst.False); NativeUtils.free_str_ptr(dirPtr); NativeUtils.free_str_ptr(keyPtr); PcsFileInfo[] r = NativeUtils.GetFileListFromPcsFileInfoListPtr(listPtr); if (listPtr != IntPtr.Zero) NativeMethods.pcs_filist_destroy(listPtr); return r; }
/// <summary> /// 列出文件 /// </summary> /// <param name="pcs"></param> /// <param name="dir">列出该目录下的文件,地址需写全,如/temp</param> /// <param name="pageindex">页索引,从1开始</param> /// <param name="pagesize">每页大小</param> /// <param name="order">排序字段,可选值:name|time|size</param> /// <param name="desc">true - 表示倒序排列;false - 表示正序排列</param> /// <returns>返回文件列表</returns> public static PcsFileInfo[] pcs_list(BaiduPCS pcs, string dir, int pageindex, int pagesize, string order = "name", bool desc = false) { IntPtr dirPtr = NativeUtils.utf8_str_ptr(dir); IntPtr orderPtr = NativeUtils.utf8_str_ptr(order); IntPtr listPtr = NativeMethods.pcs_list(pcs.Handle, dirPtr, pageindex, pagesize, orderPtr, desc ? NativeConst.True : NativeConst.False); NativeUtils.free_str_ptr(dirPtr); NativeUtils.free_str_ptr(orderPtr); PcsFileInfo[] r = NativeUtils.GetFileListFromPcsFileInfoListPtr(listPtr); if (listPtr != IntPtr.Zero) NativeMethods.pcs_filist_destroy(listPtr); return r; }
/// <summary> /// 设置错误消息 /// </summary> /// <param name="pcs"></param> /// <param name="errmsg">错误消息</param> public static void pcs_set_serrmsg(BaiduPCS pcs, string errmsg) { IntPtr errmsgPtr = NativeUtils.utf8_str_ptr(errmsg); NativeMethods.pcs_set_serrmsg(pcs.Handle, errmsgPtr); NativeUtils.free_str_ptr(errmsgPtr); }
/// <summary> /// 获取本地文件的大小 /// </summary> /// <param name="pcs"></param> /// <param name="local_path">本地文件路径</param> /// <returns></returns> public static long pcs_local_filesize(BaiduPCS pcs, string local_path) { IntPtr localPtr = NativeUtils.str_ptr(local_path); long sz = NativeMethods.pcs_local_filesize(pcs.Handle, localPtr); NativeUtils.free_str_ptr(localPtr); return sz; }
/// <summary> /// 获取错误消息 /// </summary> /// <param name="pcs"></param> /// <returns>如果有错误发生,则返回错误消息,否则返回 null</returns> public static string pcs_strerror(BaiduPCS pcs) { IntPtr r = NativeMethods.pcs_strerror(pcs.Handle); if (r != IntPtr.Zero) return NativeUtils.utf8_str(r); return null; }
/// <summary> /// 退出 /// </summary> /// <param name="pcs"></param> /// <returns>成功后返回PCS_OK,失败则返回PCS_FAIL</returns> public static PcsRes pcs_logout(BaiduPCS pcs) { PcsRes r = (PcsRes)NativeMethods.pcs_logout(pcs.Handle); return r; }