/// <summary> /// 创建文件上传 /// </summary> /// <param name="path">文件路径</param> /// <param name="listFileItem">列表文件数据</param> /// <param name="index">起始位置</param> /// <param name="data">文件数据</param> /// <param name="onCreated">上传回调处理</param> public void CreateUpload(string path, ref ListFileItem listFileItem, long index, ref SubArray <byte> data, Func <ReturnValue <UploadFileIdentity>, bool> onCreated) { ServerUploadFile uploadFile = null; try { uploadFile = new ServerUploadFile(this, path, ref listFileItem, index, ref data, onCreated); Monitor.Enter(fileLock); try { files.Add(uploadFile.Identity, uploadFile); } finally { Monitor.Exit(fileLock); } onCreated = null; } finally { if (onCreated == null) { uploadFile.Start(); } else { onCreated(new UploadFileIdentity(SynchronousState.ServerException)); } } }
/// <summary> /// 上传文件 /// </summary> /// <param name="server">文件同步服务端</param> /// <param name="path">文件路径</param> /// <param name="listFileItem">列表文件数据</param> /// <param name="index">当前写入位置</param> /// <param name="data">写入数据</param> /// <param name="onCreated">创建文件回调处理</param> internal ServerUploadFile(Server server, string path, ref ListFileItem listFileItem, long index, ref SubArray <byte> data, Func <ReturnValue <UploadFileIdentity>, bool> onCreated) : base(server, path, ref listFileItem, null) { this.onCreated = onCreated; this.index = index; this.data = data; }
/// <summary> /// 服务端文件 /// </summary> /// <param name="server">文件同步服务端</param> /// <param name="path">文件路径</param> /// <param name="listFileItem">列表文件数据</param> /// <param name="fileInfo">文件信息</param> internal ServerFile(Server server, string path, ref ListFileItem listFileItem, FileInfo fileInfo) { this.server = server; this.path = path; this.listFileItem = listFileItem; this.fileInfo = fileInfo ?? new FileInfo(Path.Combine(Path.Combine(server.Path, path), listFileItem.Name)); IsUpload = fileInfo == null; Identity = Interlocked.Increment(ref identity); checkTimeoutSeconds = AutoCSer.Date.NowTime.CurrentSeconds; }
/// <summary> /// 获取文件列表 /// </summary> /// <param name="directory"></param> /// <returns></returns> private static ListFileItem[] getList(DirectoryInfo directory) { DirectoryInfo[] DirectoryArray = directory.GetDirectories(); FileInfo[] FileArray = directory.GetFiles(); ListFileItem[] ListFileArray = new ListFileItem[DirectoryArray.Length + FileArray.Length]; int Index = 0; foreach (DirectoryInfo NextDirectory in DirectoryArray) { ListFileArray[Index++].Set(NextDirectory.Name, NextDirectory.LastWriteTimeUtc, long.MinValue); } foreach (FileInfo NextFile in FileArray) { ListFileArray[Index++].Set(NextFile.Name, NextFile.LastWriteTimeUtc, NextFile.Length); } return(ListFileArray); }
/// <summary> /// 创建文件下载 /// </summary> /// <param name="path">文件路径</param> /// <param name="listFileItem">列表文件数据</param> /// <param name="onCreated">下载回调处理</param> public void CreateDownload(string path, ref ListFileItem listFileItem, Func <ReturnValue <DownloadFileIdentity>, bool> onCreated) { ServerDownloadFile downloadFile = null; SynchronousState state = SynchronousState.ServerException; try { FileInfo fileInfo = new FileInfo(System.IO.Path.Combine(System.IO.Path.Combine(Path, path), listFileItem.Name)); if (fileInfo.Exists) { downloadFile = new ServerDownloadFile(this, path, ref listFileItem, fileInfo, onCreated); Monitor.Enter(fileLock); try { files.Add(downloadFile.Identity, downloadFile); } finally { Monitor.Exit(fileLock); } onCreated = null; } else { state = SynchronousState.NotExists; } } finally { if (onCreated == null) { downloadFile.Start(); } else { onCreated(new DownloadFileIdentity(state)); } } }
/// <summary> /// 下载文件 /// </summary> /// <param name="server">文件同步服务端</param> /// <param name="path">文件路径</param> /// <param name="listFileItem">列表文件数据</param> /// <param name="fileInfo">文件信息</param> /// <param name="onCreated">创建文件回调处理</param> internal ServerDownloadFile(Server server, string path, ref ListFileItem listFileItem, FileInfo fileInfo, Func <ReturnValue <DownloadFileIdentity>, bool> onCreated) : base(server, path, ref listFileItem, fileInfo) { this.onCreated = onCreated; }