/// <summary> /// 客户端文件 /// </summary> /// <param name="client">文件同步客户端</param> /// <param name="path">文件路径</param> /// <param name="name">文件名称</param> /// <param name="fileNameKey">文件名称关键字</param> /// <param name="onCompleted">文件同步完成处理委托</param> /// <param name="isUpload">是否上传,否则为下载</param> internal ClientFile(Client client, string path, string name, ref FileNameKey fileNameKey, Action <ClientFile, SynchronousState> onCompleted, bool isUpload) { this.client = client; this.path = path; this.name = name; this.FileNameKey = fileNameKey; this.onCompleted = onCompleted; this.IsUpload = isUpload; fileInfo = new FileInfo(Path.Combine(path, name)); }
/// <summary> /// 增加同步文件 /// </summary> /// <param name="synchronousFile">客户端文件</param> /// <param name="fileNameKey">文件名称关键字</param> /// <returns>文件同步状态</returns> private SynchronousState synchronous(ClientFile synchronousFile, ref FileNameKey fileNameKey) { ClientFile clientFile; Monitor.Enter(fileLock); try { if (files.TryGetValue(fileNameKey, out clientFile)) { return(clientFile.IsUpload ? SynchronousState.Uploading : SynchronousState.Downloading); } files.Add(fileNameKey, synchronousFile); } finally { Monitor.Exit(fileLock); } return(SynchronousState.Success); }
/// <summary> /// 文件上传 /// </summary> /// <param name="path">文件路径</param> /// <param name="name">文件名称</param> /// <param name="onCompleted">文件同步完成处理委托</param> /// <returns>文件同步状态</returns> public SynchronousState Upload(string path, string name, Action <ClientFile, SynchronousState> onCompleted) { SynchronousState state = SynchronousState.Unknown; try { FileNameKey fileNameKey = new FileNameKey(path.FileNameToLower(), name.FileNameToLower()); ClientUploadFile uploadFile = new ClientUploadFile(this, path, name, ref fileNameKey, onCompleted); state = synchronous(uploadFile, ref fileNameKey); if (state == SynchronousState.Success) { onCompleted = null; return(uploadFile.Upload()); } return(state); } finally { if (onCompleted != null) { onCompleted(null, state); } } }
/// <summary> /// 上传文件 /// </summary> /// <param name="client">文件同步客户端</param> /// <param name="path">文件路径</param> /// <param name="name">文件名称</param> /// <param name="fileNameKey">文件名称关键字</param> /// <param name="onCompleted">文件同步完成处理委托</param> internal ClientUploadFile(Client client, string path, string name, ref FileNameKey fileNameKey, Action <ClientFile, SynchronousState> onCompleted) : base(client, path, name, ref fileNameKey, onCompleted, true) { }
/// <summary> /// 删除同步文件 /// </summary> /// <param name="fileNameKey"></param> internal void Remove(ref FileNameKey fileNameKey) { Monitor.Enter(fileLock); files.Remove(fileNameKey); Monitor.Exit(fileLock); }