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;
        }
Exemple #3
0
 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;
 }
Exemple #4
0
 /// <summary>
 /// 获取下载速度
 /// </summary>
 /// <param name="pcs"></param>
 /// <returns>返回下载速度</returns>
 public static double pcs_speed_download(BaiduPCS pcs)
 {
     return NativeMethods.pcs_speed_download(pcs.Handle);
 }
Exemple #5
0
        /// <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;
        }
Exemple #6
0
 /// <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;
 }
Exemple #7
0
 /// <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;
 }
Exemple #8
0
 /// <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;
 }
Exemple #9
0
 /// <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;
 }
Exemple #10
0
 /// <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;
 }
Exemple #11
0
 /// <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);
 }
Exemple #12
0
 /// <summary>
 /// 清除错误消息
 /// </summary>
 /// <param name="pcs"></param>
 public static void pcs_clear_errmsg(BaiduPCS pcs)
 {
     NativeMethods.pcs_clear_errmsg(pcs.Handle);
 }
Exemple #13
0
 /// <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);
 }
Exemple #14
0
 /// <summary>
 /// 把 from 中的用户信息复制到本对象中,因此本对象具有和 from 一样的用户身份。
 /// </summary>
 /// <param name="from"></param>
 public void cloneUserInfo(BaiduPCS from)
 {
     pcs_clone_userinfo(this, from);
 }
Exemple #15
0
 /// <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;
 }
Exemple #16
0
 /// <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;
 }
Exemple #17
0
 /// <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;
 }
Exemple #18
0
 /// <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;
 }
Exemple #19
0
 /// <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;
 }
Exemple #20
0
 /// <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;
 }
Exemple #21
0
 /// <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;
 }
Exemple #22
0
 /// <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;
 }
Exemple #23
0
 /// <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;
 }
Exemple #24
0
 /// <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;
 }
Exemple #25
0
 /// <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;
 }
Exemple #26
0
 /// <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;
 }
Exemple #27
0
 /// <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);
 }
Exemple #28
0
 /// <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;
 }
Exemple #29
0
 /// <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;
 }
Exemple #30
0
 /// <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;
 }