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  这样的路径。

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

posted on 2009-05-20 09:40  zqonline  阅读(324)  评论(0编辑  收藏  举报

导航