public string Download(string fileURL, string filePath, string msgId = "") { if (string.IsNullOrWhiteSpace(msgId)) { msgId = TimeStamp.Create(); } FileMessageInfo info = FileMessageInfo.Create(fileURL); info.MessageId = msgId; info.ProcessType = FileProcessType.DOWNLOAD; info.FilePath = filePath; info.Status = 1; info.Client.DownloadProgressChanged += webClient_DownloadProgressChanged; info.Client.DownloadFileCompleted += Client_DownloadFileCompleted; new TaskFactory().StartNew(() => { try { info.Client.DownloadFileAsync(new Uri(fileURL), filePath, info); } catch (Exception ex) { ProcessError(msgId, ex); } }); m_FileMsgQueue.Add(info); return(msgId); }
/// <summary> /// 断点下载,需服务器支持CustomRange /// </summary> /// <param name="fileURL"></param> /// <param name="filePath"></param> /// <param name="msgId"></param> /// <returns></returns> private string Download_BreakPoint(string fileURL, string filePath, string msgId = "") { if (string.IsNullOrWhiteSpace(msgId)) { msgId = TimeStamp.Create(); } long currentLength = 0; if (File.Exists(filePath)) { var fileInfo = new FileInfo(filePath); currentLength = fileInfo.Length; } FileMessageInfo info = FileMessageInfo.Create(fileURL); info.Client.Headers.Add("CustomRange", string.Format("bytes={0}-", currentLength)); info.MessageId = msgId; info.FilePath = filePath; info.ProcessType = FileProcessType.DOWNLOAD; info.Status = 1; m_FileMsgQueue.Add(info); info.Client.DownloadDataCompleted += Client_DownloadDataCompleted; info.Client.DownloadProgressChanged += webClient_DownloadProgressChanged; new TaskFactory().StartNew(() => { info.Client.DownloadDataAsync(new Uri(fileURL), info); }); return(msgId); }
public void Upload(string msg_id, string upload_url, string path) { FileMessageInfo info = FileMessageInfo.Create(upload_url); info.MessageId = msg_id; info.ProcessType = FileProcessType.UPLOAD; info.Client.UploadProgressChanged += UploadProgressChanged; info.Client.UploadDataCompleted += UploadDataCompleted; info.Status = 1; info.FilePath = path; m_FileMsgQueue.Add(info); var createBytes = new CreateBytes(); string contentType = createBytes.ContentType; info.Client.Headers.Add("Content-Type", contentType); //new TaskFactory().StartNew(() => //{ //}); new TaskFactory().StartNew(() => { // LogOpInfo("upload_begin" ,Thread.CurrentThread.ManagedThreadId.ToString()); try { int leftLength = (int)GetUploadStartPos(upload_url); byte[] fileData = File.ReadAllBytes(path).Skip(leftLength).ToArray(); info.StartPos = leftLength; ArrayList bytesArray = new ArrayList(); bytesArray.Add(createBytes.CreateFieldData("file", Path.GetFileName(path) , "application/octet-stream", fileData)); byte[] postData = createBytes.JoinBytes(bytesArray); info.TotalFileLength = postData.Length + leftLength; info.Client.UploadDataAsync(new Uri(upload_url), "POST", postData, info); //LogOpInfo("upload_end", Thread.CurrentThread.ManagedThreadId.ToString()); } catch (Exception ex) { ProcessError(msg_id, ex); } }); }
public void Deserialize(Stream input) { var header = input.ReadStructure <FileHeader>(); if (header.Version != 7) { throw new FormatException("version"); } if (header.EndOfFile != input.Length) { throw new FormatException(); } if (header.Magic != 0x3147534D) { throw new FormatException(); } if (header.Unknown0C != 0) { throw new FormatException(); } if (header.EndOfData + header.ExtraSize != input.Length) { throw new FormatException(); } var messageInfos = new FileMessageInfo[header.MessageCount]; for (int i = 0; i < messageInfos.Length; i++) { messageInfos[i] = input.ReadStructure <FileMessageInfo>(); } var stringTableInfo = input.ReadStructure <FileBlockInfo>(); var unknownInfo = input.ReadStructure <FileBlockInfo>(); if (unknownInfo.Offset != 0 || unknownInfo.Count != 0) { throw new FormatException(); } this.Messages = new List <Message>(); foreach (var messageInfo in messageInfos) { input.Seek(0x20 + messageInfo.Offset, SeekOrigin.Begin); switch (messageInfo.Type) { case 0: { string name = input.ReadString(24, true, Encoding.ASCII); short pageCount = input.ReadValueS16(); short unknown = input.ReadValueS16(); uint[] pageOffsets = new uint[pageCount]; for (int i = 0; i < pageOffsets.Length; i++) { pageOffsets[i] = input.ReadValueU32(); } uint size = input.ReadValueU32(); for (int i = 0; i < pageOffsets.Length; i++) { pageOffsets[i] -= (uint)input.Position; } var memory = input.ReadToMemoryStream(size); var dialogue = new Dialogue(); dialogue.Name = name; dialogue.Unknown = unknown; dialogue.PageOffsets.AddRange(pageOffsets); dialogue.Data = memory; this.Messages.Add(dialogue); break; } case 1: { string name = input.ReadString(24, true, Encoding.ASCII); short unknown = input.ReadValueS16(); short choiceCount = input.ReadValueS16(); uint unknown2 = input.ReadValueU32(); if (unknown != 0) { throw new FormatException(); } uint[] choiceOffsets = new uint[choiceCount]; for (int i = 0; i < choiceOffsets.Length; i++) { choiceOffsets[i] = input.ReadValueU32(); } uint size = input.ReadValueU32(); for (int i = 0; i < choiceOffsets.Length; i++) { choiceOffsets[i] -= (uint)input.Position; } var memory = input.ReadToMemoryStream(size); var dialogue = new Choices(); dialogue.Name = name; dialogue.ChoiceOffsets.AddRange(choiceOffsets); dialogue.Data = memory; this.Messages.Add(dialogue); break; } default: { throw new FormatException(); } } } input.Seek(0x20 + stringTableInfo.Offset, SeekOrigin.Begin); uint[] stringOffsets = new uint[stringTableInfo.Count]; for (int i = 0; i < stringOffsets.Length; i++) { stringOffsets[i] = input.ReadValueU32(); } this.Strings = new List <string>(stringOffsets.Length); for (int i = 0; i < stringOffsets.Length; i++) { input.Seek(0x20 + stringOffsets[i], SeekOrigin.Begin); /* this really should read the string as an * array of bytes but for now, since it's not really * ASCII, but I'm lazy and it's not necessary to * retain it at the moment */ //this.Strings.Add(input.ReadStringASCIIZ()); this.Strings.Add(input.ReadStringGameZ()); } }