• 面向对象—在线文件管理模块


    面向对象—在线文件管理模块

    2012-08-21 21:42 by xiangxiong, 527 阅读, 3 评论, 收藏编辑

    在园子里看到好多关于在线文件管理系统的文章和源代码,大家实际上达到的目的其实多大同小异,但是采用的实现的方式大有不同。

    本人刚好在项目中应用到在线文件管理模块,如实自己开始写了一个Demo,当然也参考了网上高人写的代码,下面介绍我对这个模块实现的思路和实现。

    实现思路介绍:

    文件对象        FileSystemItem.cs

    文件操作管理类  FileSystemManager.cs

    界面            Demo.aspx

    Js              jqModal.js   弹出窗口

    文件对象

    此类对文件对象的属性进行封装。

     using System;

    复制代码
    using System.Collections.Generic;
    using System.Text;

    namespace FileManager
    {
        /// <summary>
        
    /// FileSystemItem
        
    /// </summary>
        public class FileSystemItem
        {
            private string _Name;
            private string _FullName;

            private DateTime _CreationDate;
            private DateTime _LastAccessDate;
            private DateTime _LastWriteDate;

            private bool _IsFolder;

            private long _Size;
            private long _FileCount;
            private long _SubFolderCount;

            private string _Version;

            /// <summary>
            
    /// 名称
            
    /// </summary>
            public string Name
            {
                get
                {
                    return _Name;
                }
                set
                {
                    _Name = value;
                }
            }

            /// <summary>
            
    /// 完整目录
            
    /// </summary>
            public string FullName
            {
                get
                {
                    return _FullName;
                }
                set
                {
                    _FullName = value;
                }
            }

            /// <summary>
            
    /// 创建时间
            
    /// </summary>
            public DateTime CreationDate
            {
                get
                {
                    return _CreationDate;
                }
                set
                {
                    _CreationDate = value;
                }
            }

            /// <summary>
            
    /// 是否是文件夹
            
    /// </summary>
            public bool IsFolder
            {
                get
                {
                    return _IsFolder;
                }
                set
                {
                    _IsFolder = value;
                }
            }

            /// <summary>
            
    /// 大小
            
    /// </summary>
            public long Size
            {
                get
                {
                    return _Size;
                }
                set
                {
                    _Size = value;
                }
            }

            /// <summary>
            
    /// 访问时间
            
    /// </summary>
            public DateTime LastAccessDate
            {
                get
                {
                    return _LastAccessDate;
                }
                set
                {
                    _LastAccessDate = value;
                }
            }

            /// <summary>
            
    /// 修改时间
            
    /// </summary>
            public DateTime LastWriteDate
            {
                get
                {
                    return _LastWriteDate;
                }
                set
                {
                    _LastWriteDate = value;
                }
            }

            /// <summary>
            
    /// 文件数
            
    /// </summary>
            public long FileCount
            {
                get
                {
                    return _FileCount;
                }
                set
                {
                    _FileCount = value;
                }
            }

            /// <summary>
            
    /// 文件夹数
            
    /// </summary>
            public long SubFolderCount
            {
                get
                {
                    return _SubFolderCount;
                }
                set
                {
                    _SubFolderCount = value;
                }
            }

            /// <summary>
            
    /// 版本
            
    /// </summary>
            
    /// <returns></returns>
            public string Version()
            {
                if (_Version == null)
                    _Version = GetType().Assembly.GetName().Version.ToString();

                return _Version;
            }

        }
    }
    复制代码

    文件操作类

    此类封装对文件的,新建,重命名,删除,复制,剪贴,上传等操作。

     using System;

    复制代码
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Web;

    namespace FileManager
    {
        /// <summary>
        
    /// FileSystemManager
        
    /// </summary>
        public class FileSystemManager
        {
            private static string strRootFolder;

            static FileSystemManager()
            {
                strRootFolder = HttpContext.Current.Request.PhysicalApplicationPath;
                strRootFolder = strRootFolder.Substring(0, strRootFolder.LastIndexOf(@"\"));
            }

            /// <summary>
            
    /// 读根目录
            
    /// </summary>
            
    /// <returns></returns>
            public static string GetRootPath()
            {
                return strRootFolder;
            }

            /// <summary>
            
    /// 写根目录
            
    /// </summary>
            
    /// <param name="path"></param>
            public static void SetRootPath(string path)
            {
                strRootFolder = path;
            }

            /// <summary>
            
    /// 读取列表
            
    /// </summary>
            
    /// <returns></returns>
            public static List<FileSystemItem> GetItems()
            {
                return GetItems(strRootFolder);
            }

            /// <summary>
            
    /// 读取列表
            
    /// </summary>
            
    /// <param name="path"></param>
            
    /// <returns></returns>
            public static List<FileSystemItem> GetItems(string path)
            {
                string[] folders = Directory.GetDirectories(path);
                string[] files = Directory.GetFiles(path);
                List<FileSystemItem> list = new List<FileSystemItem>();
                foreach (string s in folders)
                {
                    FileSystemItem item = new FileSystemItem();
                    DirectoryInfo di = new DirectoryInfo(s);
                    item.Name = di.Name;
                    item.FullName = di.FullName;
                    item.CreationDate = di.CreationTime;
                    item.IsFolder = true;
                    list.Add(item);
                }
                foreach (string s in files)
                {
                    FileSystemItem item = new FileSystemItem();
                    FileInfo fi = new FileInfo(s);
                    item.Name = fi.Name;
                    item.FullName = fi.FullName;
                    item.CreationDate = fi.CreationTime;
                    item.IsFolder = true;
                    item.Size = fi.Length;
                    list.Add(item);
                }

                if (path.ToLower() != strRootFolder.ToLower())
                {
                    FileSystemItem topitem = new FileSystemItem();
                    DirectoryInfo topdi = new DirectoryInfo(path).Parent;
                    topitem.Name = "[上一级]";
                    topitem.FullName = topdi.FullName;
                    list.Insert(0, topitem);

                    FileSystemItem rootitem = new FileSystemItem();
                    DirectoryInfo rootdi = new DirectoryInfo(strRootFolder);
                    rootitem.Name = "[根目录]";
                    rootitem.FullName = rootdi.FullName;
                    list.Insert(0, rootitem);

                }
                return list;
            }

            /// <summary>
            
    /// 读取文件夹
            
    /// </summary>
            
    /// <param name="name"></param>
            
    /// <param name="parentName"></param>
            public static void CreateFolder(string name, string parentName)
            {
                DirectoryInfo di = new DirectoryInfo(parentName);
                di.CreateSubdirectory(name);
            }

            /// <summary>
            
    /// 删除文件夹
            
    /// </summary>
            
    /// <param name="path"></param>
            public static void DeleteFolder(string path)
            {
                Directory.Delete(path);
            }

            /// <summary>
            
    /// 移动文件夹
            
    /// </summary>
            
    /// <param name="oldPath"></param>
            
    /// <param name="newPath"></param>
            public static void MoveFolder(string oldPath, string newPath)
            {
                Directory.Move(oldPath, newPath);
            }

            /// <summary>
            
    /// 创建文件
            
    /// </summary>
            
    /// <param name="filename"></param>
            
    /// <param name="path"></param>
            public static void CreateFile(string filename, string path)
            {
                FileStream fs = File.Create(path + "\\" + filename);
                fs.Close();
            }

            /// <summary>
            
    /// 创建文件
            
    /// </summary>
            
    /// <param name="filename"></param>
            
    /// <param name="path"></param>
            
    /// <param name="contents"></param>
            public static void CreateFile(string filename, string path, byte[] contents)
            {
                FileStream fs = File.Create(path + "\\" + filename);
                fs.Write(contents, 0, contents.Length);
                fs.Close();
            }

            /// <summary>
            
    /// 删除文件
            
    /// </summary>
            
    /// <param name="path"></param>
            public static void DeleteFile(string path)
            {
                File.Delete(path);
            }

            /// <summary>
            
    /// 移动文件
            
    /// </summary>
            
    /// <param name="oldPath"></param>
            
    /// <param name="newPath"></param>
            public static void MoveFile(string oldPath, string newPath)
            {
                File.Move(oldPath, newPath);
            }

            /// <summary>
            
    /// 读取文件信息
            
    /// </summary>
            
    /// <param name="path"></param>
            
    /// <returns></returns>
            public static FileSystemItem GetItemInfo(string path)
            {
                FileSystemItem item = new FileSystemItem();
                if (Directory.Exists(path))
                {
                    DirectoryInfo di = new DirectoryInfo(path);
                    item.Name = di.Name;
                    item.FullName = di.FullName;
                    item.CreationDate = di.CreationTime;
                    item.IsFolder = true;
                    item.LastAccessDate = di.LastAccessTime;
                    item.LastWriteDate = di.LastWriteTime;
                    item.FileCount = di.GetFiles().Length;
                    item.SubFolderCount = di.GetDirectories().Length;
                }
                else
                {
                    FileInfo fi = new FileInfo(path);
                    item.Name = fi.Name;
                    item.FullName = fi.FullName;
                    item.CreationDate = fi.CreationTime;
                    item.LastAccessDate = fi.LastAccessTime;
                    item.LastWriteDate = fi.LastWriteTime;
                    item.IsFolder = false;
                    item.Size = fi.Length;
                }
                return item;
            }

            /// <summary>
            
    /// 复制文件夹
            
    /// </summary>
            
    /// <param name="source"></param>
            
    /// <param name="destination"></param>
            public static void CopyFolder(string source, string destination)
            {
                String[] files;
                if (destination[destination.Length - 1] != Path.DirectorySeparatorChar)
                    destination += Path.DirectorySeparatorChar;
                if (!Directory.Exists(destination)) Directory.CreateDirectory(destination);
                files = Directory.GetFileSystemEntries(source);
                foreach (string element in files)
                {
                    if (Directory.Exists(element))

                        CopyFolder(element, destination + Path.GetFileName(element));
                    else
                        File.Copy(element, destination + Path.GetFileName(element), true);
                }
            }
        }
    }

    复制代码

    界面:

          

    总结:

    本人虽然从事软件开发实1年多,但是对面向对象的理解还是不太透彻,也许可能实战还不够经验不足,希望和园友一起探讨和交流,提出宝贵建议和意见。

    本人QQ:541719273  (向雄)

        /Files/binb/webfilemanager.zip   文件管理模块源代码下载

     

    使用ICE建立C++与C#的通讯

        ICE的优势是作为通讯中间件可支持跨平台的通讯,目前支持C++、C#、JAVA、Python、Ruby等多种语言。下面通过一个示例,描述怎样通过ICE建立C++与C#之间的通讯。

    一 示例描述

        搭建一个简单的聊天室,服务端使用C++实现,客户端使用C#实现,中间以ICE构建通讯通道。聊天室实现的功能包括:用户登录/注销、发送消息、接受消息。

    二 准备Slice文件

        Slice作为ICE本身特有的语言,成为跨平台通讯的桥梁。通过Slice文件描述需要实现的接口,再由ICE提供的各个语言编译器生成各语言的接口类,各语言分别负责根据接口类实现属于本身的逻辑细节即可,据说这种思想是从老牌的通讯中间件CORBA中借鉴过来的。

        聊天室的Slice文件定义如下:

    复制代码
    module Chat {
    
    interface Room {
    
        bool login(string user, MessageReceiver* receiver);
    
        void logout(string user);
    
        void sendMessage(string user, string message);
    
    };
    
    interface MessageReceiver {
    
        void onMessage(string sender, string msg);
    
    };
    
    dictionary<string, MessageReceiver*> UserList;
    
    };
    复制代码

       分析上面的Slice文件如下:

    1、 在命名空间为Chat下定义了两个类(接口),Room和MessageReceiver。

    2、 Room主要是Server端实现,Client端调用。实现了登录、注销和发送信息的接口函数。

    3、 MessageReceiver主要是Client端实现,Server端调用的回调函数接口。这是因为Server端在向Client端发送信息的时候,必须知道Client端的通讯地址。因此需要这个回调函数类。

    4、 UserList主要是Server端用来存储Client端的用户名及回调函数句柄的。

    三 实现Server端

        通过Slice2Cpp程序将Slice文件生成ChatRoom.h和ChatRoom.cpp,将两个文件加入到工程中,同时新建一个类继承Chat::Room,实现Room的三个虚拟函数接口,这个类被称为Server端的Servant类。代码如下:

          

    复制代码
    class ChatRoomI :public Chat::Room
    
           {
    
           public:
    
                  ChatRoomI(void);
    
                  ~ChatRoomI(void);
    
                  virtual bool login(const ::std::string&, const ::Chat::MessageReceiverPrx&, const ::Ice::Current& );
    
                   virtual void logout(const ::std::string&, const ::Ice::Current& );
    
                  virtual void sendMessage(const ::std::string&, const ::std::string&, const ::Ice::Current&);
    
           private :
    
                  Chat::UserList _userList;
    
                  void BroadCast(const ::std::string user,const ::std::string message);
    
                  bool Notify(const ::std::string& user, const ::std::string& message, const ::Chat::MessageReceiverPrx& receiver);
    
     
    
           };
    复制代码

        注意有两个私有函数BroadCast和Notify为从Server端广播消息至Client端时用到的,并没有什么神秘的地方。示例工程可在文章末尾处下载,具体实现细节略去。

    四 实现Client端

        使用Slice2CS程序将Slice文件生成ChatRoom.cs文件,将此cs文件添加到一个控制台程序的工程中。新建MsgReceiver类继承Chat.MessageReceiverDisp_,Chat.MessageReceiverOperations_两个抽象类,实现onMessage函数。

    复制代码
    public override void onMessage(string sender, string msg, Ice.Current current__)
    
        {
    
            Console.WriteLine(String.Format("{0}:{1}", sender, msg));
    
         }
    复制代码

    新建Client类,实现Client端与Server端之间的通讯逻辑,并生成MsgReceiver类的本地代理类,发送到Server端实现发送消息的回调逻辑。

    复制代码
                Ice.ObjectAdapter objAdapter =  communicator().createObjectAdapterWithEndpoints(
    
                    "Chat.UserAdapter", "default -h 127.0.0.1 -p 10001");
    
                Ice.Object msgRece = new MsgReceiver();
    
                objAdapter.add(msgRece,communicator().stringToIdentity("Chat.User"));
    
                objAdapter.activate();
    
     
    
                 Chat.MessageReceiverPrx userPrx = Chat.MessageReceiverPrxHelper.uncheckedCast
    
    (objAdapter.createProxy(communicator().stringToIdentity("Chat.User")));
    复制代码

    示例工程在本文末尾下载。

     

    四 示例截图

    Server端:

    Client端:

     代码下载:

    Server

    Client

     

     

     

     
    分类: C++
  • 相关阅读:
    TypeScript完全解读(26课时)_2.TypeScript完全解读-基础类型
    Flutter实战视频-移动电商-48.详细页_详情和评论的切换
    Flutter实战视频-移动电商-47.详细页_Flutter_html插件的使用
    TypeScript完全解读(26课时)_1.TypeScript完全解读-开发环境搭建
    [Android] The connection to adb is down, and a severe error has occured
    每日一小练——求质数
    C++语言笔记系列之十八——虚函数(1)
    Android 输入管理服务-输入事件向详细应用的分发
    Android技术归档
    C++编写绚丽的界面
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2650211.html
Copyright © 2020-2023  润新知