zoukankan      html  css  js  c++  java
  • Lily.Core.FileDataProvider文件管理使用范例。

    此组件主要支持进行文件管理,当前版本(1.0.0.2)支持局域网和FTP模式,可以自主扩展访问方式;

    主要功能:

    创建目录,删除目录,上传文件,下载文件,删除文件,返回远程路径。主要是这五个功能。

    文件或目录在物理磁盘上的名称,默认都是以ID为名称的,所以不存在目录或文件的更改。

    此组件不能单独使用,必须结合lily.Core实体结合使用。设计的目的是让一个实体可以对应一个或多个文件。把文件当作实体的字段。

    表结构设计注意:

    目录必须按ID,ParentID的结果。

    文件使用目录ID进行关联。

    对象层次:

    目录或文件对象都继承于:Lily.Core.FileDataProvider.EntityFileBase

    目录或文件对象操作类都继承于:Lily.Core.FileDataProvider.FileEntityHandler

    下面列出一个代码示例:

    Private f_目录 As Lily.Core.FileDataProvider.DirectoryField

      <Browsable(False)> _
      Public Overridable ReadOnly Property _目录() As Lily.Core.FileDataProvider.DirectoryField
          Get
              If f_目录 Is Nothing Then

                 '这是默认实体字段对象的获取方式
                  '   f_目录 = Lily.Core.Util.OQLHelper.GetEntityField(Me, "目录", "目录", False, False, DbType.String, 50)

                '这是文件对象字段实体获取方式,这里是目录。

                '其实DirectoryField也是继承于EntityField对象的。
                  Me.f_目录 = Me.FileConnection.GetDirectoryField(Me, "目录", "目录", False, False, DbType.String, 50)
              End If
              Return f_目录
          End Get
      End Property

    如果是文件则是:

    Private f_文件 As Core.FileDataProvider.FileField
    <Browsable(False)> _
    Public Overridable ReadOnly Property _文件() As Core.FileDataProvider.FileField
         Get
             If f_文件 Is Nothing Then
                 'f_文件名称 = Lily.Core.Util.OQLHelper.GetEntityField(Me, "文件名称", "文件名称", False, False, DbType.String, 100)
                 Me.f_文件 = Me.FileConnection.GetFileField(Me, "文件", "文件", False, False, DbType.String, 1000, False, False, Me)
             End If
             Return f_文件
         End Get
    End Property

    可以看出没有太大的区别。其中FileField与DirectoryField都是继承于实体字段EntityField。FileConnection见下面介绍

    文件和目录都需要重新基类一个方法和一个属性

    返回一个连接对象,组件设计之初就考虑了可以支持不同访问方式如:局域网或FTP,或其它的。所以都应该重写基类的FileConnection属性,返回一个可用可配置的连接对象。 这里有一个ConfigurationInfo.GetConnection是通过配置文件反射获取文件连接对象。对于局域网路径或FTP用户名密码等都在配置文件中。

    Public Overrides Property FileConnection() As FileDataProvider.IFileConnection
            Get
                If MyBase.FileConnection Is Nothing Then
                    Return ConfigurationInfo.GetConnection()
                End If
                Return MyBase.FileConnection
            End Get
            Set(ByVal Value As FileDataProvider.IFileConnection)
                MyBase.FileConnection = Value
            End Set
        End Property

    获取对象的父路径,Lily.Core.FileDataProvider.Util.GetParentPath调用了一个存储过程,把ID,ParentID转换路径字符串。返回父目录路径或文件的目录路径部份。注意红色部份是文件实体里的代码,蓝色是目录实体里的代码。要区分一下,主要是传入的ID不一样。

    Public Overrides Function GetParentPath() As String
        Static path As String = String.Empty

        If Me.FileConnection Is Nothing Then
            Throw New Lily.Core.FileDataProvider.FileDataException("连接对象为空,不能进行文件管理。")
        End If

        If path Is Nothing OrElse path.Length = 0 Then
            Dim t As New tb_目录管理

           下面是文件的
            path = Lily.Core.FileDataProvider.Util.GetParentPath(Me.FileConnection, t._ID.AttributeName, t._ParentID.AttributeName, t, Me.目录ID)

           下面是目录的

            path = Lily.Core.FileDataProvider.Util.GetParentPath(Me.FileConnection, t._ID.AttributeName, t._ParentID.AttributeName, t, Me.ParentID)
        End If

        If Not path Is Nothing OrElse path.Length > 0 Then
            Return path
        Else
            Return String.Empty
        End If
    End Function

    文件实体对象就创建好了。由于类的继承是单一的,这样实体就不具备权限方面的属性。可以通过以下这段代码来解决这个问题。

    获取权利管理对象

    ReadOnly Property Permission() As Lily.ComponentFramework.IPermission
             Get
                 Return Lily.ComponentFramework.ComponentManager.Permission
             End Get
         End Property

    如增加一个删除文件判断的方法。

          Public Overridable Function HasDeleteFile() As Boolean
              Return Me.Permission.Has(Me, "删除文件")
          End Function

    对于控件,还需要重写基类的GetPurviewObjectList方法。

        Public Overrides Function GetPurviewObjectList() As System.Collections.ArrayList
            Static ary As ArrayList
            If ary Is Nothing Then
                ary = New ArrayList
            Else
                Return ary
            End If
            ary.Add(New Common.tb_文件管理)

            Return ary
        End Function

    基础了,我们来看看。文件对象的添加,删除,下载,查看。

    上传文件:

    dim item as new tb_文件管理

    dim o as new tb_文件管理_Operate

    item._文件.LocalFile="c:\1.txt"

    o.Accept(Me.item)

    删除文件:

    Dim o As New Common.tb_文件管理_Operate
    o.Delete(item)

    其实删除与删除实体是一样,文件对象就是一个实体,只是在删除实体记录时,删除相应的文件记录。这中间启用了事务,保证了记录与物理文件的对应关系。但是删除最好不要嵌套,这样就不能保证关系的一致性了。因为文件删除后,不能回滚。

    下载文件:

    item._文件.DownFile(s.FileName)

    其实s.Filename下载存放的路径。

    远程路径:

    Dim file As String = Me.ActiveFile.FileConnection.GetFullPath(Me.ActiveFile._文件)
    FileViewerNav.Viewer(file)

    这里为什么调用FileConnection对象的GetFullPath方法获取全路径呢,为什么不使用me.ActiveFile._文件.RemoteFullFileName属性。因为了RemoteFullFileName返回的路径可能是一个相对的。局域网上一个绝对的,FTP是相对的。而FileConnection的getfullPath方法返回就是一个绝对的远程路径。对于局域网就是\\xxx.xxxx.xxxx.xxx\user 这样的路径方式;FTP类似于ftp://user:pwd@xxx.xxx.xxx.xxx:21/3/4/1.txt  这样的路径。

    目录操作与文件操作类似。

  • 相关阅读:
    Python logging模块异步线程写日志实现过程解析
    Python数据分析实战项目介绍
    Pytorch 卷积中的 Input Shape用法
    Python 找出出现次数超过数组长度一半的元素实例
    Linux系统如何安装Python?新手教程
    MySQL 日志 复制数据库 InnoDB表空间模式 mysql默认数据库
    MySQL 8.0 窗口函数 排名、topN问题
    MySQL 求中位数 两个案例
    MySQL 创建表 复制表结构的两种方法 插入相同数据 重命名表 排查并修改字符集
    mysql if 和 case
  • 原文地址:https://www.cnblogs.com/zqonline/p/1467273.html
Copyright © 2011-2022 走看看