Esempio n. 1
0
        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);
        }
Esempio n. 2
0
            /// <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);
            }
Esempio n. 3
0
            /// <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);
            }
Esempio n. 4
0
            /// <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);
            }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
            }
        }
Esempio n. 8
0
            /// <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);
            }