/// <summary> /// 创建文件缓存路径 /// </summary> /// <param name="chunk">文件分段信息</param> /// <returns>文件缓存路径</returns> protected virtual string CreateUrl(ChunkInfo chunk) { try { Task.Factory.StartNew(Clear); } catch { } _mutex.WaitOne(); try { var url = GetUrl(DateTime.Today, chunk.AttachKey, chunk.UploadKey); if (io.Directory.Exists(url)) { io.Directory.CreateDirectory(url); } return(url); } finally { _mutex.ReleaseMutex(); } }
/// <summary> /// 刷新文件合并信息 /// </summary> /// <param name="chunk">文件分段信息</param> /// <returns>文件分段信息</returns> protected virtual ChunkInfo RefreshMergeInfo(ChunkInfo chunk) { if (!chunk.Chunks.HasValue || chunk.Chunks == 1) { return(chunk); } MergeInfo mergeInfo; var key = string.Concat(chunk.AttachKey, chunk.UploadKey, chunk.FileID).GetHashCode().ToString() + chunk.FileID; _rmutex.WaitOne(); try { if (!MergeInfo.TryGetValue(key, out mergeInfo)) { MergeInfo[key] = mergeInfo = new MergeInfo { Expires = DateTime.Now.AddHours(8), Merged = 1 } } ; else { mergeInfo.Merged++; mergeInfo.Expires = DateTime.Now.AddHours(8); } if (chunk.Chunks <= mergeInfo.Merged) { MergeInfo.Remove(key); return(chunk); } return(null); } finally { _rmutex.ReleaseMutex(); } }
/// <summary> /// 合并文件 /// </summary> /// <param name="chunk">需要合并的文件片段信息</param> /// <returns>合并后的文件信息</returns> public static FileInfo Merge(ChunkInfo chunk) { return(MergeProvider.Factory.Merge(chunk)); }
/// <summary> /// 合并文件 /// </summary> /// <param name="chunk">文件分段信息</param> /// <returns>文件信息</returns> internal virtual FileInfo Merge(ChunkInfo chunk) { return(RefreshMergeInfo(new MergeProvider(CreateUrl(chunk)).Merge(chunk))); }