private void download(fastCSharp.net.tcp.commandServer.socket client, listName listName, Stream fileStream , Func <returnValue <listName>, bool> onDownload) { listName listNameState = new listName { Length = (long)(byte)fileState.NoPermission, LastWriteTime = DateTime.MinValue }; try { if (verify(client)) { FileInfo file = new FileInfo(listName.Name); listName.Set(file.FullName); if (verify(client, listName.LowerName, permissionType.Read)) { if (file.Exists) { fastCSharp.threading.threadPool.TinyPool.Start(downloader.GetDownload(onDownload, listName, fileStream)); return; } listNameState.Length = (long)(byte)fileState.FileNotFound; } } } catch (Exception error) { listNameState.Length = (long)(byte)fileState.Exception; log.Error.Add(error, null, false); } pub.Dispose(ref fileStream); onDownload(listNameState); }
/// <summary> /// 文件操作结束 /// </summary> /// <param name="listName">列表名称</param> private void push(listName listName) { Func <returnValue <listName>, bool> onDownload = this.onDownload; this.onDownload = null; pub.Dispose(ref fileStream); typePool <downloader> .PushNotNull(this); onDownload(listName); }
/// <summary> /// 获取文件下载器 /// </summary> /// <param name="onDownload">下载结束委托</param> /// <param name="listName">列表名称</param> /// <param name="fileStream">文件流</param> /// <returns>文件下载器</returns> public static Action GetDownload (Func <returnValue <listName>, bool> onDownload, listName listName, Stream fileStream) { downloader downloader = typePool <downloader> .Pop() ?? new downloader(); downloader.listName = listName; downloader.onDownload = onDownload; downloader.fileStream = fileStream; return(downloader.downloadHandle); }
/// <summary> /// 获取文件上传器 /// </summary> /// <param name="permission">权限路径</param> /// <param name="onUpload">上传结束委托</param> /// <param name="listName">列表名称</param> /// <param name="fileStream">文件流</param> /// <returns>文件上传器</returns> public static Action GetUpload(permission permission, Func <returnValue <fileState>, bool> onUpload , listName listName, Stream fileStream, int backupIdentity, bool isTimeVersion) { uploader uploader = typePool <uploader> .Pop() ?? new uploader(); uploader.permission = permission; uploader.listName = listName; uploader.onUpload = onUpload; uploader.fileStream = fileStream; uploader.backupIdentity = backupIdentity; uploader.isTimeVersion = isTimeVersion; return(uploader.uploadHandle); }
/// <summary> /// 获取文件列表 /// </summary> /// <param name="pathInfo">目录信息</param> /// <returns>文件列表</returns> private static listName[] getListName(DirectoryInfo pathInfo) { DirectoryInfo[] directorys = pathInfo.GetDirectories(); FileInfo[] files = pathInfo.GetFiles(); listName[] listNames = new listName[directorys.Length + files.Length]; int index = 0; foreach (DirectoryInfo directory in directorys) { listNames[index++].Set(directory.Name, directory.LastWriteTimeUtc, long.MinValue); } foreach (FileInfo file in files) { listNames[index++].Set(file.Name, file.LastWriteTimeUtc, file.Length); } return(listNames); }
private fileState upload(fastCSharp.net.tcp.commandServer.socket client, listName listName, byte[] data, int backupIdentity, bool isTimeVersion) { fileState fileState = fileState.NoPermission; try { if (verify(client)) { FileInfo file = new FileInfo(listName.Name); listName.Set(file.FullName); permission permission = getPermission(client, listName.LowerName); if (verify(permission, permissionType.Write)) { bool isFile = file.Exists; if (isFile && isTimeVersion && file.LastWriteTimeUtc > listName.LastWriteTime) { return(server.fileState.TimeVersionError); } if (!isFile || file.LastWriteTimeUtc != listName.LastWriteTime || listName.Length != file.Length) { if (isFile) { permission.Backup(file, backupIdentity); } File.WriteAllBytes(listName.Name, data); new FileInfo(listName.Name).LastWriteTimeUtc = listName.LastWriteTime; } fileState = fileState.Success; } } } catch (Exception error) { fileState = fileState.Exception; log.Error.Add(error, listName.Name, false); } return(fileState); }
private void upload(fastCSharp.net.tcp.commandServer.socket client, listName listName, Stream fileStream, int backupIdentity, bool isTimeVersion , Func <returnValue <fileState>, bool> onUpload) { fileState fileState = fileState.NoPermission; try { if (verify(client)) { FileInfo file = new FileInfo(listName.Name); listName.Set(file.FullName); permission permission = getPermission(client, listName.LowerName); if (verify(permission, permissionType.Write)) { DirectoryInfo directory = file.Directory; if (!directory.Exists) { directory.Create(); } Action upload = uploader.GetUpload(permission, onUpload, listName, fileStream, backupIdentity, isTimeVersion); onUpload = null; fileStream = null; fastCSharp.threading.threadPool.TinyPool.Start(upload); } } } catch (Exception error) { fileState = fileState.Exception; log.Error.Add(error, listName.Name, false); } pub.Dispose(ref fileStream); if (onUpload != null) { onUpload(fileState); } }
/// <summary> /// 下载文件 /// </summary> private void download() { listName listNameState = new listName { Length = (long)(byte)fileState.Exception, LastWriteTime = DateTime.MinValue }; FileStream readStream = null; try { FileInfo fileInfo = new FileInfo(listName.Name); if (fileInfo.LastWriteTimeUtc != listName.LastWriteTime || fileInfo.Length != listName.Length) { listNameState.Set(string.Empty, fileInfo.LastWriteTimeUtc, fileInfo.Length); } else { long position = fileStream.Position; readStream = new FileStream(listName.Name, FileMode.Open, FileAccess.Read, FileShare.Read); long length = readStream.Length; if (position < length) { if (position != 0) { readStream.Seek(position, SeekOrigin.Begin); } while (position < length) { int read = readStream.Read(buffer, 0, buffer.Length); if (read > 0) { fileStream.Write(buffer, 0, read); position += read; } else { break; } } } if (position == length) { listNameState.Set(fileInfo.Name, fileInfo.LastWriteTimeUtc, length); } else { listNameState.Length = (long)(byte)fileState.LengthError; } } } catch (Exception error) { listNameState.Length = (long)(byte)fileState.Exception; log.Error.Add(error, null, false); } Exception exception = null; pub.Dispose(ref readStream, ref exception); if (exception != null) { log.Error.Add(exception, null, false); if (listNameState.Name != null) { listNameState.Length = (long)(byte)fileState.Exception; listNameState.Set(null); } } push(listNameState); }