/// <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)));
 }