文件管理系统 订阅
文件管理越来越受到企业的重视,但是企业在进行文件管理的过程中,经常会碰到以下的问题:海量文件存储,管理困难;查找缓慢,效率低下;文件版本管理混乱;文件安全缺乏保障;文件无法有效协作共享;知识管理举步维艰等。所以文件管理系统逐渐成为国内外业界研究的热点。 展开全文
文件管理越来越受到企业的重视,但是企业在进行文件管理的过程中,经常会碰到以下的问题:海量文件存储,管理困难;查找缓慢,效率低下;文件版本管理混乱;文件安全缺乏保障;文件无法有效协作共享;知识管理举步维艰等。所以文件管理系统逐渐成为国内外业界研究的热点。
信息
外文名
File Management System
解决问题
文件版本管理混乱等
分    类
开始文档管理系统
中文名
文件管理系统
功    能
集中存储
文件管理系统发展
随着信息化进程,信息资源的地位得到了越来越广泛的认同;电子文件,作为电子政务最重要的资源形式,它的价值得到了越来越充分的肯定。 [1]  电子政务的发展十分迅速,运行其中的电子文件比重日益上升,文件管理工作的重要性也逐步彰显。 [1]  构建规范统一的文件管理系统 [1]  ,保存、保护电子政府活动的证据 [1]  ,是加强文件管理的重要途径之一。 [1] 
收起全文
精华内容
下载资源
问答
  • 操作系统作为磁盘文件系统和用户之间的中介,必须在内核中建立自己的文件系统,为与磁盘文件系统相区别,我们把它叫做操作系统的文件管理系统,简称文件管理系统。   文件管理系统与磁盘文件系统的关系 与处理器...

    操作系统作为磁盘文件系统和用户之间的中介,必须在内核中建立自己的文件系统,为与磁盘文件系统相区别,我们把它叫做操作系统的文件管理系统,简称文件管理系统。

     

    文件管理系统与磁盘文件系统的关系

    与处理器相比,磁盘是一种工作速度极其缓慢的外部设备,操作系统很难直接利用磁盘文件系统来对文件进行操作。因此,操作系统必须根据磁盘文件系统提供的各种基本信息在内存中建立必要的缓冲数据结构,一方面为了避免频繁地访问磁盘,另一方面也用来记录文件的一些动态信息。与此同时,还要建立一些操作系统自用的文件管理用表。

    文件管理系统中的管理用表及缓冲区主要有:

    • 文件注册表。包含文件系统在磁盘分区中信息的登记表;
    • 全局打开文件表。包含每个打开文件的文件控制块(FCB)的附件以及其他信息;
    • 进程打开文件表。该表为进程所有,它包含一些指针,这些指针指向全局打开文件表中本进程当前所使用的FCB;
    • 目录缓冲区。用来保存近期访问过的目录信息;
    • 索引节点缓冲区;
    • 文件缓冲区。用来保存当前或近期访问文件的内容。

    下图以打开文件和读取文件操作表示了文件管理系统和磁盘文件系统的关系:

    当用户进程使用系统调用open()打开一个文件时,该系统调用会向磁盘驱动器发出驱动命令,在磁盘的目录文件中按用户进程给出的文件名或者文件存储路径搜索该文件的目录节点;找到后将在内存创建一个该节点的数据结构,将磁盘中的目录节点的信息复制过来,并把该文件的i节点(FCB)存放在一个叫做全局打开文件表的表中。

    之所以这么做,是为了使进程可以直接用内存中的数据结构来访问该文件,而不必再去访问慢速的磁盘了。

    从上面的叙述中可知,操作系统的文件管理系统就是磁盘文件系统与用户进程之间的中介。

     

    文件缓冲区

    为提高访问文件的效率,稍微复杂一些的操作系统都在内存中创建了缓冲区。所谓缓冲,是指系统为当前和最近读写操作过的文件内容在内存中保留一份副本,以便再次需要访问这些内容时就不必费时费力地从磁盘中读入了。当需要写磁盘时,可以先写到副本中,待系统较为空闲时再将副本写入磁盘。

    除此之外,文件缓冲区还为多线程共享同一个文件建立了基础。

     

    文件系统的层次结构

    从存储位置来看,文件系统的层次结构如下所示:

    从组织层次来看,文件系统的层次结构如下所示:

    在这种层次结构中,每层都利用底层的功能实现更高级的抽象,甚至把文件变成用户便于理解的方式。

    设备驱动层是由设备驱动程序和中断处理程序组成,它处于文件系统的最底层,负责将上层的命令翻译成设备可以理解的底层命令,以驱动硬件设备的数据读写操作。

    基本文件系统的任务主要是向驱动层发送合适的驱动命令。该层通常与文件组织模块合并成为文件组织系统。

    文件组织模块知道文件及其逻辑块和物理块,知道文件存储块的分配方式和文件的位置,所以文件组织模块负责将上层的逻辑文件操作翻译成实际的驱动命令。另外,文件组织模块还要负责进行空闲块的管理与分配工作。

    逻辑文件系统处于最高层,用来接收应用程序的命令。逻辑文件系统负责管理系统用于文件管理的所有数据结构,向文件组织模块提供组织信息(例如添加、删除目录和节点),并通过文件控制块(FCB)来维护文件结构和文件的保护安全。

     

    虚拟文件系统

    目前,面对各式各样、各具特点的文件系统,能否以同一界面来使用不同的文件系统就成了衡量通用操作系统性能的标准之一,所以现代操作系统大多都是采用虚拟文件系统(Vitual Filesystem Switch,VFS)。

    所谓虚拟文件系统,就是一个本身并没有文件的系统,但它为其他不同的实际文件系统提供了统一的操作界面,也就是说,它相当于一个“书皮”。其设计思想是:既然所有实际文件系统都是用来管理文件的,那么它们总有一些共性,特别是在文件的操作方面,誓如,它们都有文件的打开、关闭、读、写等操作。这样,就可以利用这些共性来构建一个统一的文件系统框架,并用这个框架来容纳实际文件系统,以实现不同文件系统的统一管理。

    虚拟文件系统和实际文件系统的关系示意图如下:

    简单地说,设置虚拟文件系统的目的就是:统一不同的文件系统,并不让用户与实际文件系统直接见面。

     

    展开全文
  • springboot快速搭建文件管理系统

    千次阅读 热门讨论 2019-03-13 23:33:03
    前几天搞了一个文件管理系统,因为几乎做每一个项目都涉及到上传文件这一步骤,不可能每一个项目都做一个模块处理文件,所以我最近整了一个小文件系统来用,这样子别的项目上传文件的话,直接可以上传到该项目即可。...

    前几天搞了一个文件管理系统,因为几乎做每一个项目都涉及到上传文件这一步骤,不可能每一个项目都做一个模块处理文件,所以我最近整了一个小文件系统来用,这样子别的项目上传文件的话,直接可以上传到该项目即可。。。

    目前支持多端文件上传, 默认使用本地磁盘存储

    整体效果,如下:

    项目结构

    在这里插入图片描述

    首页效果

    在这里插入图片描述

    日志查看在这里插入图片描述

    (1)解决了什么问题?

    • 简化其他项目的文件处理(上传 | 下载)问题,统一处理
    • 个人的小云盘,并且可以提供外链访问下载等

    这个文件系统主要功能其中包括上传文件下载文件在线观看删除文件文件检索访问监控防盗链
    其中文件是存储在七牛云服务器上的,简要介绍一下,七牛云有10G的对象存储空间可以使用,永久的,支持http,不提供https流量,所以这也是我撘文件系统的原因之一,就是为了小程序的https…否则小程序无法访问图片

    防盗链效果

    在这里插入图片描述
    but 对于爬虫来说无任何阻碍【捂脸】

    (2)用到的技术栈

    • 前端
      • freemarker
      • bootstrap
      • bootstrap-table
      • jquery
    • 后台
      • springboot 2.1.3.RELEASE
      • spring-data-jpa 2.1.3.RELEASE
      • mysql 5.7
    • 搭建
      • tomcat 9.0.1 (or 7.0)
      • maven 3.5.4
    • 其他依赖
      • qiniu[7.2.0, 7.2.99]
      • fastjson 1.2.54

    (3)未来的期望

    暂时的话不想继续完善了,先实习然后学习一段时间先,基本功能差不多,继续添加的功能的话,就是为了用技术而作了,等有时间了会考虑继续迭代吧

    • 多用户(用户管理)
    • 文件管理(文件签名)
    • 权限控制(spring security)
    • 分布式文件存储(hadoop HDFS):正在学习中…

    (4)哪里下载

    导入注意事项:

    1. sql文件

      修改 application.properties

      spring.jpa.hibernate.ddl-auto=create-drop # 自动创建表
      
    2. 修改数据库

      spring.datasource.url=jdbc:mysql://localhost/{database}?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
      
    3. 修改 application.properties本地存储的路径

      # 设置文件处理这, 支持多个, 使用英文逗号分隔。如 DiskFileHelper,QiNiuFileHelper
      handle.file.helper=DiskFileHelper
      # 本地存储的路径
      disk.file.path=C:/Users/houyu/Desktop/temp
      
    4. 七牛云配置 (可以省略, 默认使用本地文件存储 handle.file.helper=DiskFileHelper )
      前往七牛云官网注册账号,并且获取绑定好域名,如果不绑定,七牛云提供一个月的免费域名,一个月后失效,建议绑定自己的,前往对象存储创建Bucket,并且获取accessKey secretKey domainOfBucket在util.QiniuUtil.java文件中修改对应的配置即可。

      private static final String accessKey = "your accessKey";
      private static final String secretKey = "your secretKey";
      private static final String bucket = "your bucket";
      private static final Configuration cfg = new Configuration(Zone.zone0());
      private static final String domainOfBucket = "your domainOfBucket";
      
    交流

    博客同步到SHY BLOG
    mail :for.houyu@qq.com

    展开全文
  • java简单文件管理系统源码

    千次下载 热门讨论 2007-11-21 14:25:16
    设计一个文件管理方案,模拟一个简单的文件管理系统。要求目录结构为树型结构,目录下可以是目录,也可以是文件。通过该实验是学生可以深刻理解文件系统的概念、所涉及的基本操作及实现时的主要数据结构。 建议用...
  • 说起分布式文件管理系统,大家可能很容易想到 HDFS、GFS 等系统,前者是 Hadoop 的一部分,后者则是 Google 提供的分布式文件管理系统。除了这些之外,国内淘宝和腾讯也有自己的分布式文件管理系统,都叫 TFS...

    说起分布式文件管理系统,大家可能很容易想到 HDFS、GFS 等系统,前者是 Hadoop 的一部分,后者则是 Google 提供的分布式文件管理系统。除了这些之外,国内淘宝和腾讯也有自己的分布式文件管理系统,都叫 TFS(Taobao File SystemTencent File System)。

    相对于上面提到的这些分布式文件管理系统而言,FastDFS 可能离我们 Java 工程师更近一些,因为文件上传这个功能太常见了,而想要搭建独立的分布式文件管理系统,FastDFS+Nginx 组合无疑是最佳方案。因此,松哥今天就来和大家简单聊一聊这个问题。

    如果小伙伴们还不懂在传统的开发环境下如何进行文件上传,可以参考松哥之前发的文件上传教程:

    1.什么是 FastDFS

    1.1 FastDFS 简介

    FastDFS 由淘宝的余庆大佬在 2008 年开源的一款轻量级分布式文件管理系统,FastDFS 用 C 语言实现,支持 Linux、FreeBSD、MacOS 等类 UNIX 系统。FastDFS 类似 google FS,属于应用级文件系统,不是通用的文件系统,只能通过专有 API 访问,目前提供了 C 和 Java SDK ,以及 PHP 扩展 SDK。

    这款开源软件从发布至今,历经数十年,这款开源软件的生命力依然旺盛,在业界依然备受推崇,当然这也得益于作者一直在不断完善该软件。

    FastDFS 专为互联网应用量身定做,解决大容量文件存储问题,追求高性能和高扩展性,它可以看做是基于文件的 key/value 存储系统,key 为文件 ID,value 为文件内容,因此称作分布式文件存储服务更为合适。

    1.2 为什么需要 FastDFS

    传统的企业级开发对于高并发要求不是很高,而且数据量可能也不大,在这样的环境下文件管理可能非常 Easy。

    但是互联网应用访问量大、数据量大,在互联网应用中,我们必须考虑解决文件大容量存储和高性能访问的问题,而 FastDFS 就特别适合干这件事情,常见的图片存储、视频存储、文档存储等等我们都可以采用 FastDFS 来做。

    1.3 FastDFS 架构

    作为一款分布式文件管理系统,FastDFS 主要包括四个方面的功能:

    • 文件存储
    • 文件同步
    • 文件上传
    • 文件下载

    这个方面的功能,基本上就能搞定我们常见的文件管理需求了。

    下面这是一张来自 FastDFS 官网的系统架构图:

    从上面这张图中我们可以看到,FastDFS 架构包括 Tracker 和 Storage 两部分,看名字大概就能知道,Tracker 用来追踪文件,相当于是文件的一个索引,而 Storage 则用来保存文件。

    我们上传文件的文件最终保存在 Storage 上,文件的元数据信息保存在 Tracker 上,通过 Tracker 可以实现对 Storage 的负载均衡。

    Storage 一般会搭建成集群,一个 Storage Cluster 可以由多个组构成,不同的组之间不进行通信,一个组又相当于一个小的集群,组由多个 Storage Server 组成,组内的 Storage Server 会通过连接进行文件同步来保证高可用。

    2.FastDFS 安装

    介绍完 FastDFS 之后,相信小伙伴已经摩拳擦掌跃跃欲试了,接下来我们就来看下 FastDFS 的安装。

    我这里为了测试方便,就不开启多台虚拟机了,Tracker 和 Storage 我将安装在同一台服务器上。

    图片上传我们一般使用 FastDFS,图片上传成功之后,接下来的图片访问我们一般采用 Nginx,所以这里的安装我将从三个方面来介绍:

    • Tracker 安装
    • Storage 安装
    • Nginx 安装

    2.1 Tracker 安装

    安装,我们首先需要准备一个环境两个库以及一个安装包。

    1.一个环境

    先来看一个环境,由于 FastDFS 采用 C 语言开发,所以在安装之前,如果没有 gcc 环境,需要先安装,安装命令如下:

    yum install gcc-c++
    

    2.两个库

    再来看两个库,由于 FastDFS 依赖 libevent 库,安装命令如下:

    yum -y install libevent
    

    另一个库是 libfastcommon,这是 FastDFS 官方提供的,它包含了 FastDFS 运行所需要的一些基础库。

    libfastcommon 下载地址:https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz

    考虑到 GitHub 访问较慢,松哥已经把安装文件下载好了,放在百度网盘上,小伙伴们可以在松哥公众号后台回复 fastdfs 获取下载链接。

    将下载好的 libfastcommon 拷贝至 /usr/local/ 目录下,然后依次执行如下命令:

    cd /usr/local
    tar -zxvf V1.0.43.tar.gz
    cd libfastcommon-1.0.43/
    ./make.sh
    ./make.sh install
    

    3.一个安装包

    接下来我们下载 Tracker,注意,由于 Tracker 和 Storage 是相同的安装包,所以下载一次即可(2.2 小节中不用再次下载)。

    安装文件可以从 FastDFS 的 GitHub 仓库上下载,下载地址:https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz

    考虑到 GitHub 访问较慢,松哥已经把安装文件下载好了,放在百度网盘上,小伙伴们可以在松哥公众号后台回复 fastdfs 获取下载链接。

    下载成功后,将下载文件拷贝到 /usr/local 目录下,然后依次执行如下命令安装:

    cd /usr/local
    tar -zxvf V6.06.tar.gz
    cd fastdfs-6.06/
    ./make.sh
    ./make.sh install
    

    安装成功后,执行如下命令,将安装目录内 conf 目录下的配置文件拷贝到 /etc/fdfs 目录下:

    cd conf/
    cp ./* /etc/fdfs/
    

    4.配置

    接下来进入 /etc/fdfs/ 目录下进行配置:

    打开 tracker.conf 文件:

    vi tracker.conf
    

    修改如下配置:

    默认端口是 22122,可以根据实际需求修改,我这里就不改了。然后下面配置一下元数据的保存目录(注意目录要存在)。

    5.启动

    接下来执行如下命令启动 Tracker:

    /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
    

    如此之后,我们的 Tracker 就算安装成功了。

    2.2 Storage 安装

    简单起见,这里我们搭建一个 Storage 实例即可。Storage 安装也需要 libevent 和 libfastcommon,这两个库的安装参考上文,这里我不在细说。

    Storage 本身的安装,也和 Tracker 一致,执行命令也都一样,因为我这里将 Tracker 和 Storage 安装在同一台服务器上,所以不用再执行安装命令了(相当于安装 Tracker 时已经安装了 Storage 了)。

    唯一要做的,就是进入到 /etc/fdfs 目录下,配置 Storage:

    vi storage.conf
    

    这里一共配置三个地方,分别是 base_path、store_path0 以及 tracker_server ,tracker_server 模板有两个地址,我们这里只有一个,配置完成后,记得注释掉另外一个不用的。

    配置完成后,执行如下命令启动 Storage:

    /usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
    

    这两个启动完成后,现在就可以做文件的上传了,但是一般如果是图片文件,我们还需要提供一个图片的访问功能,目前来说最佳方案当然是 Nginx 了,所以我们这里连同 Nginx 一起配置好,再来做测试。

    2.3 Nginx 安装

    Nginx 可以算是 FastDFS 的重要搭档。

    Nginx 的安装分为两个步骤:

    • 安装 Nginx
    • 首先在 Storage 下安装 fastdfs-nginx-module

    第一步简单,松哥之前专门写过一篇文章扫盲 Nginx,所以 Nginx 安装大家直接参考这里:Nginx 极简入门教程!

    接下来看第二步。

    首先下载 fastdfs-nginx-module,下载地址:https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz

    考虑到 GitHub 访问较慢,松哥已经把安装文件下载好了,放在百度网盘上,小伙伴们可以在松哥公众号后台回复 fastdfs 获取下载链接。

    下载完成后,将下载的文件拷贝到 /usr/local 目录下。然后进入 /usr/local 目录,分别执行如下命令:

    cd /usr/local
    tar -zxvf V1.22.tar.gz
    

    然后将 /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf 文件拷贝到 /etc/fdfs/ 目录下,并修改该文件的内容:

    vi /etc/fdfs/mod_fastdfs.conf
    

    接下来,回到第一步下载的 nginx 安装文件的解压目录中,执行如下命令,重新配置编译安装:

    ./configure --add-module=/usr/local/fastdfs-nginx-module-1.22/src
    make
    make install
    

    安装完成后,修改 nginx 的配置文件,如下:

    vi /usr/local/nginx/conf/nginx.conf
    

    在这里配置 nginx 请求转发。

    配置完成后,启动 nginx,看到如下日志,表示 nginx 启动成功:

    ngx_http_fastdfs_set pid=9908
    

    疑问:fastdfs-nginx-module 有啥用

    看了整个安装过程之后,很多小伙伴有疑问,到头来还是 nginx 本身直接找到了图片文件目录,fastdfs-nginx-module 到底有啥用?

    前面我们说过,Storage 由很多组构成,每个组又是一个小的集群,在每一个组里边,数据会进行同步,但是如果数据还没同步,这个时候就有请求发来了,该怎么办?此时fastdfs-nginx-module 会帮助我们直接从源 Storage 上获取文件。

    安装成功了。

    3.Java 客户端调用

    安装成功后,接下来我们就用 Java 客户端来测试一下文件上传下载。

    首先我们来创建一个普通的 Maven 工程,添加如下依赖:

    <dependency>
        <groupId>net.oschina.zcx7878</groupId>
        <artifactId>fastdfs-client-java</artifactId>
        <version>1.27.0.0</version>
    </dependency>
    

    然后,在项目的 resources 目录下添加 FastDFS 的配置文件 fastdfs-client.properties,内容如下:

    fastdfs.connect_timeout_in_seconds = 5
    fastdfs.network_timeout_in_seconds = 30
    fastdfs.charset = UTF-8
    fastdfs.http_anti_steal_token = false
    fastdfs.http_secret_key = FastDFS1234567890
    fastdfs.http_tracker_http_port = 80
    fastdfs.tracker_servers = 192.168.91.128:22122
    fastdfs.connection_pool.enabled = true
    fastdfs.connection_pool.max_count_per_entry = 500
    fastdfs.connection_pool.max_idle_time = 3600
    fastdfs.connection_pool.max_wait_time_in_ms = 1000
    

    这里的配置基本上都能见名知义,我就不挨个解释了。这里先配置下 fastdfs.tracker_servers,这是 Tracker 的地址,根据实际情况配置即可。

    fastdfs.http_secret_key 配置这里先不用管它,后面我会跟大家解释。

    3.1 文件上传

    配置完成后,先来看文件上传,代码如下:

    @Test
    void testUpload() {
        try {
            ClientGlobal.initByProperties("fastdfs-client.properties");
            TrackerClient tracker = new TrackerClient();
            TrackerServer trackerServer = tracker.getConnection();
            StorageServer storageServer = null;
            StorageClient1 client = new StorageClient1(trackerServer, storageServer);
            NameValuePair nvp[] = null;
            //上传到文件系统
            String fileId = client.upload_file1("C:\\Users\\javaboy\\Pictures\\picpick\\1.png", "png",
                    nvp);
            logger.info(fileId);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    这里,首先加载配置文件,然后构造一个 TrackerClient 对象,接着再根据这个对象获取到一个 TrackerServer,然后创建一个 StorageClient1 实例。NameValuePair 中保存的是文件的元数据信息,如果有的话,就以 key/value 的方式来设置,如果没有的话,直接给一个 null 即可。

    最后,调用 client 的 upload_file1 方法上传文件,第一个参数是文件路径,第二个参数是文件的扩展名,第三个参数就是文件的元数据信息,这个方法的返回值,就是上传文件的访问路径。执行该方法,打印日志如下:

    2020-02-29 17:46:03.017  INFO 6184 --- [           main] o.j.fastdfs.FastdfsApplicationTests      : group1/M00/00/00/wKhbgF5aMteAWy0gAAJkI7-2yGk361.png
    

    group1/M00/00/00/wKhbgF5aMteAWy0gAAJkI7-2yGk361.png 就是文件的路径,此时,在浏览器中输入 http://192.168.91.128/group1/M00/00/00/wKhbgF5aMteAWy0gAAJkI7-2yGk361.png 就可以看到上传的图片了。

    3.2 文件下载

    @Test
    void testDownload() {
        try {
            ClientGlobal.initByProperties("fastdfs-client.properties");
            TrackerClient tracker = new TrackerClient();
            TrackerServer trackerServer = tracker.getConnection();
            StorageServer storageServer = null;
            StorageClient1 client = new StorageClient1(trackerServer, storageServer);
            byte[] bytes = client.download_file1("group1/M00/00/00/wKhbgF5aMteAWy0gAAJkI7-2yGk361.png");
            FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\javaboy\\Pictures\\picpick\\666.png"));
            fos.write(bytes);
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    这段代码就很好理解了,直接调用 download_file1 方法获取到一个 byte 数组,然后通过 IO 流写出到本地文件即可。

    4.安全问题

    现在,任何人都可以访问我们服务器上传文件,这肯定是不行的,这个问题好解决,加一个上传时候的令牌即可。

    首先我们在服务端开启令牌校验:

    vi /etc/fdfs/http.conf
    

    配置完成后,记得重启服务端:

    ./nginx -s stop
    ./nginx
    

    接下来,在前端准备一个获取令牌的方法,如下:

    @Test
    public void getToken() throws Exception {
        int ts = (int) Instant.now().getEpochSecond();
        String token = ProtoCommon.getToken("M00/00/00/wKhbgF5aMteAWy0gAAJkI7-2yGk361.png", ts, "FastDFS1234567890");
        StringBuilder sb = new StringBuilder();
        sb.append("?token=").append(token);
        sb.append("&ts=").append(ts);
        System.out.println(sb.toString());
    }
    

    这里,我们主要是根据 ProtoCommon.getToken 方法来获取令牌,注意这个方法的第一个参数是你要访问的文件 id,**注意,这个地址里边不包含 group,千万别搞错了;**第二个参数是时间戳,第三个参数是密钥,密钥要和服务端的配置一致。

    将生成的字符串拼接,追加到访问路径后面,如:http://192.168.91.128/group1/M00/00/00/wKhbgF5aMteAWy0gAAJkI7-2yGk361.png?token=7e329cc50307000283a3ad3592bb6d32&ts=1582975854此时访问路径里边如果没有令牌,会访问失败。

    好了,大功告成!下次和大家讲我如何在 Spring Boot 中玩这个东西。

    展开全文
  • 怎么用JAVA实现文件管理系统,JAVA菜鸟真心求助。 二、实验项目内容 1、实现文件夹创建、删除、进入。 2、实现当前文件夹下的内容罗列。 3、实现文件拷贝和文件夹拷贝(文件夹拷贝指深度拷贝,包括所有子目录和文件...
  • WPF 文件管理系统

    千次阅读 2016-04-08 17:50:28
    简介:用WPF开发的一款简单的文件管理系统,主要用到了IO、TreeView、ListView这三样比较基础的东西,由于已有半年没有接触过WPF了,之前一直在开发Unity3D,这次开发也是因为公司需要这么一个简单的东西,所以花了一...

    简介:用WPF开发的一款简单的文件管理系统,主要用到了IO、TreeView、ListView这三样比较基础的东西,由于已有半年没有接触过WPF了,之前一直在开发Unity3D,这次开发也是因为公司需要这么一个简单的东西,所以花了一天半开发出来,刚好回忆下之前的半吊子WPF,所以写这篇博客记录一些控件的使用一些简单的设计,方便下次不用花时间去寻找,也帮助初学者一些经验,虽然我也是初学者。o(^▽^)o。

    一、界面图和效果图
    显示不出来
    界面比较简单,左边就是一个TreeView,右边就是ListView。如果WPF基础好的话,完全可以将这两个控件搞得漂漂亮亮的,不过我就没那个实力了,对WPF的数据绑定是云里雾里的,基本上都是从网上查阅资料和看书,看帮助文档。
    二、界面中”文件夹路径”

    实现的功能:在“文件夹路径”中,可以通过选择的路径,查看该路径下的所有文件
    设计:将此路径存在一个txt文本中,将选择的路径进行保存,这样下次就不用在此进行选择了。
    核心代码:

    放文件夹路径的路径
    string path = AppDomain.CurrentDomain.BaseDirectory + "\\path.txt";
    读取txt文件中的内容,这段代码中放入到窗体的Loading事件中
    try {
                    string filepath = string.Empty;//文件下的路径
                    if(File.Exists(path)) {
                        //如果文件不为空
                        StreamReader sr = new StreamReader(path, Encoding.GetEncoding("utf-8")); //读取数据
                        filepath = sr.ReadToEnd().ToString().Trim();
                        sr.Close();//关闭文件流
                        txtPath.Text = filepath;
    
                        CreateDynIconTreeView(filepath, sformat);
                        Isload = true;
                    }
                }
                catch {
                    MessageBox.Show("读取文件中的数据失败");
                    Environment.Exit(0);//关闭程序;
                }

    当点击选择路径时

    System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog();
    
    if(dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
    txtPath.Text = dialog.SelectedPath;
    }
    //如果路径不为空的话,就将路径指定到文件中
    if(!string.IsNullOrEmpty(txtPath.Text)) {
         if(!Directory.Exists(txtPath.Text)) {
              MessageBox.Show("路径不存在");
              return;
          }
    
        if(File.Exists(path)) {
            //如果文件存在,则删除该文件
            File.Delete(path);
            //之所以删除,怕出现文件重名或者文件占用问题
    }
    
    FileStream fs = new FileStream(path, FileMode.Create);//创建文件
    StreamWriter sw = new StreamWriter(fs);
    sw.WriteLine(txtPath.Text.Trim());
    sw.Close();
    fs.Close();
    
         CreateDynIconTreeView(txtPath.Text.Trim(), sformat);//根据选择的路径,加载TreeView,这里读者可以先不用看
    
               }

    三、界面中的”格式”
    图片:

    实现的功能:根据选择的格式,然后对路径下的所有文件进行重新排列,只显示该格式的所有文件
    设计:这些格式项,是运用了枚举类,类中全部是这些格式,未来如果在进行格式添加时,直接在枚举类中加上即可。不过这个设计还不是最好的,最好的应该是将这些格式写入到一个文件中,如果需要添加其他的格式,直接在文本中添加格式名即可,比较方便,不过有个问题是每个格式对应的图标又是一个问题了,如果要想解决这个办法的话,还需要考虑更多的东西,不过这个系统的重点不是这个,所以完全没必要从这里花费时间,适可而止,以后需要改进的话,在写即可。
    格式下拉列表的枚举类,只截取了部分
    核心代码:

    cmbFormat.Items.Clear();
    
    foreach(var item in Enum.GetValues(typeof(FileFormat))) {
        string strName = Enum.GetName(typeof(FileFormat), item);
        cmbFormat.Items.Add(strName);
    }
    cmbFormat.SelectedIndex = 0;
    //FileFormat是个枚举类,这里是进行对枚举类中各个值进行遍历,然后加入到ComboBox中

    四:TreeView显示文件夹和文件
    功能:根据选择的途径,将路径下的所有文件和文件夹,当选择TreeView子项时的一些基本事件,比如TreeViewItem折叠、展开等等。还有选中某个子项,ListView就显示这个选择子项下的所有文件和文件夹
    设计:需要实现上述功能,首先获取改路径下的所有文件夹和文件,要将这些文件夹和文件已TreeView的形式显示出来。(核心代码与设计一起说明)
    1、根据路径获取所有文件夹和文件

    string[] directories = Directory.GetDirectories(fPath);//根据路径,获取该路径下的文件夹,如果需要获取该路径的所有文件夹的话,就需要递归了。

    if(string.IsNullOrEmpty(format)) {
    files = Directory.GetFiles(fPath, “*”);//所有格式
    }
    else {
    files = Directory.GetFiles(fPath, “*.” + format);//文件格式
    }
    根据格式,搜索路径下的所有该格式的文件

    2、TreeView的显示
    既然路径已经获取到了,现在就需要将路径中的文件夹和文件显示在TreeView中。
    先把重要核心代码贴出来,如果不懂得话,可以去下载源码
    xaml:

    添加一级节点
    DirectoryInfo info = new DirectoryInfo(path);//获取路径目录的文件夹名
                TreeViewItem Nodes = new TreeViewItem() { Header = CreateTreeViewItem1(info.Name) };//TreeView节点的小图标,锦上添花,具体的话可看源码
    ![](http://img.blog.csdn.net/20160408172001079)
    Nodes.Expanded += Node_Expanded;//双击展开
    Nodes.Collapsed += Node_Collapsed;//双击折叠,这两个事件不懂得话。可以去看官方帮助文档
    
    //自定义类,用户纪录每个节点的对象和该节点文件夹的路径,之所以这样子做是因为当鼠标选中某个子项时,获取到该子项的对象,即可获取到对应的路径,这样ListView才会展示改路径下的所有文件和文件夹,如果有更好的办法,请您一定给我留言,我觉得一定有更好的办法,只是限于我对WPF的了解不足。
    
    public List<TVItems> listItems = new List<TVItems>();//定义的一个全局泛型,用于存所有TVItem对象和路径
    TVItems items = new TVItems() {
                    ViewItem = Nodes,
                    path = path
                };
    
    getDirectories(path, Nodes,format);//添加文件夹节点
    getfiles(path, Nodes, format);//添加文件节点
     Nodes.IsExpanded = true;//子项展开
    
     tvMain.Items.Add(Nodes);//将子项添加到TreeView控件中
    
     SetListView(path, format);//加载ListView先把这四行代码贴出来,担心读者没有这几行代码看的云里雾里,虽然我知道思路可能没那么清楚,本人也是第一次写博客,特别是这么长的,请谅解。后面我会对这四行代码有个详细的介绍,就当是先做个铺垫吧!!!o(^▽^)o
    
    添加二级节点
        添加文件夹节点
        getDirectories()方法就是加载路径下的所有文件夹和文件,并且创建一个TreeViewItem,将其加入到上一个TreeViewItem中,这里用到了递归。 format参数就是格式
        private void getDirectories(string fPath, TreeViewItem aNode,string format)
            {
                //读取我选择的路径下的文件和目录
                string[] directories = Directory.GetDirectories(fPath);//文件夹集合
    
    foreach(string pathString in directories) {
                    DirectoryInfo info = new DirectoryInfo(pathString);
                    TreeViewItem Node = new TreeViewItem() {
                        Header = CreateTreeViewItem1(info.Name),
                    };
    
                    TVItems items = new TVItems() {
                        ViewItem = Node,
                        path = pathString
                    };
                    listItems.Add(items);
    
                    //添加节点
                    aNode.Items.Add(Node);
                    aNode.Expanded += Node_Expanded;
                    aNode.Collapsed += Node_Collapsed;
                    //添加文件夹的所有文件
                    getfiles(pathString, Node, format);
    
                    if(Directory.GetDirectories(pathString) != null) {
                        getDirectories(pathString, Node,format);
                    }
                }
            }
        添加文件节点
        private void getfiles(string fPath, TreeViewItem aNode,string format)
            {
                string[] files;
                if(string.IsNullOrEmpty(format)) {
                    files = Directory.GetFiles(fPath, "*");//文件格式
                }
                else {
                    files = Directory.GetFiles(fPath, "*." + format);//文件格式
                }
    
                foreach(string filePath in files) {
                    TreeViewItem Node = new TreeViewItem() { Header = CreateTreeViewItem2(Path.GetFileName(filePath)) };
                    aNode.Items.Add(Node);
                }
            }
            文件节点不需要添加TVItems,为什么呢,之前我说过创建TVItems类的主要目的是为了当鼠标单击TreeView下TreeViewItem节点时,ListView已列表的形式显示该TreeViewItem下的所有节点(文件夹和文件)这里针对的是单击文件夹,如果单击了文件其实意义并不大,因为单击了文件,它一个单体,没必要再ListView中在此显示了。

    五:ListView列表的显示
    功能:ListView列表的主要功能是根据选中的TreeView节点,然后显示该节点下的所有文件和文件夹
    设计:既然需要显示选中节点下的所有文件和文件夹,首先必须知道选中了那个节点(这个简单),其实需要知道选中节点的路径(选中文件夹的路径),所以我设计了一个TVItems类,并且定义了两个属性,就是存储所有文件夹的节点对象和该文件夹的路径

    /// <summary>
        /// 需要加载的ListViewItem项
        /// </summary>
        public class TVItems {
            /// <summary>
            /// TreeView子项
            /// </summary>
            public TreeViewItem ViewItem {
                get; set;
            }
    
            /// <summary>
            /// 该子项的路径
            /// </summary>
            public string path {
                get; set;
            }
    
            public TVItems()
            {
            }
        }

    其实当鼠标单击了TreeView子项时

     private void tvMain_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
            {
                TreeViewItem item = (TreeViewItem)e.NewValue;//获取到选中的TreeViewItem对象
                //根据对象,往泛型中查找这个节点对象,并且获取节点对象所在的类对象,主要用到了泛型中的Find()方法,我也是最近才知道,以前一直都不知道,以前都是用foreach,用foreach查看对象一点都不好,而且效率低,占内存(我是U3D开发),代码可读性差,今天终于找到这个了
                TVItems tvItems = listItems.Find(delegate (TVItems tv) {
                    return (tv.ViewItem.Equals(item));
                });
    
                if(tvItems == null) {
                    return;
                }
                SetListView(tvItems.path, sformat);//设置ListView显示
            }

    既然获取到了鼠标单击TreeView的节点对象了,剩下就简单了,需要知道ListView显示的列是些什么信息,我这里随便显示了一些东西。用到了数据绑定。
    ListView xaml:

    <ListView Name="lvMain" MouseDoubleClick="lvMain_MouseDoubleClick">
                        <ListView.View>
                            <GridView>
                                <GridViewColumn Width="30">
                                    <GridViewColumn.Header>
                                        <TextBlock></TextBlock>
                                    </GridViewColumn.Header>
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <Image Source="{Binding ImgPath}" Width="18"/>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                                <GridViewColumn Header="文件名" Width="200" DisplayMemberBinding="{Binding Path=Name}"/>
                                <GridViewColumn Header="类型" Width="100" DisplayMemberBinding="{Binding Path=Type}"/>
                                <GridViewColumn Header="大小" Width="100" DisplayMemberBinding="{Binding Path=Size}"/>
                                <GridViewColumn Header="路径" Width="450" DisplayMemberBinding="{Binding Path=Path}"/>
    
                            </GridView>
                        </ListView.View>
    
                    </ListView>
     ListView的数据绑定,对于这个我也不是很了解,所以就不详细说明了,就不误人子弟了,不过还需要定义一个类
    public class LVItem: INotifyPropertyChanged {
            private string _Name;
            private string _Type;
            private string _Size;
            private string _Path;
            private string _ImgPath;
            public string Name {
                get {
                    return _Name;
                }
                set {
                    _Name = value;
                    if(PropertyChanged != null) {
                        PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                    }
                }
            }
            public string Type {
                get {
                    return _Type;
                }
                set {
                    _Type = value;
                    if(PropertyChanged != null) {
                        PropertyChanged(this, new PropertyChangedEventArgs("Type"));
                    }
                }
            }
            public string Size {
                get {
                    return _Size;
                }
                set {
                    _Size = value;
                    if(PropertyChanged != null) {
                        PropertyChanged(this, new PropertyChangedEventArgs("Size"));
                    }
                }
            }
            public string Path {
                get {
                    return _Path;
                }
                set {
                    _Path = value;
                    if(PropertyChanged != null) {
                        PropertyChanged(this, new PropertyChangedEventArgs("Path"));
                    }
                }
            }
            public string ImgPath {
                get {
                    return _ImgPath;
                }
                set {
                    _ImgPath = value;
                    if(PropertyChanged != null) {
                        PropertyChanged(this, new PropertyChangedEventArgs("ImgPath"));
                    }
                }
            }
            public event PropertyChangedEventHandler PropertyChanged;
        }
    OK ListView的准备工作已经做完了。
    运用最重要的东西,定义一个泛型,用来存储这个类的值,也就是ListView列表需要显示的值,这些类的赋值就是根据路径获取到该路径下的所有文件夹和文件,具体可以看源码,或者看前面的,其实也差不多,异曲同工。
    

    listLVItem.Clear();
    lvMain.ItemsSource = null;
    /*
    这里的代码就是获取路径下的文件夹和文件,然后添加到listLVItem泛型中
    */
    lvMain.ItemsSource = listLVItem;
    可能会有疑惑为什么要lvMain.ItemsSource = null;之后又lvMain.ItemsSource = listLVItem;这是因为当我们重新选择路径,或者选择某个节点或者格式限制时,ListView都需要重新刷新,如果不将ItemsSource不为空的话,那么就不会刷新。

    其他的方法
    获取文件夹的大小
    /// <summary>
            /// 获取文件夹的大小
            /// </summary>
            /// <param name="path"></param>
            /// <returns></returns>
            long GetDicrectoryLenght(string path)
            {
                if(!Directory.Exists(path)) {
                    return 0;
                }
                DirectoryInfo info = new DirectoryInfo(path);
                long lenght = 0;
                foreach(var fi in info.GetFiles()) {
                    lenght += fi.Length;
                }
                DirectoryInfo[] dis = info.GetDirectories();
                if(dis.Length > 0) {
                    for(int i = 0; i < dis.Length; i++) {
                        lenght += GetDicrectoryLenght(dis[i].FullName);
                    }
                }
                return lenght;
            }
            文件大小
    FileInfo fileInfo = new FileInfo(pathString);
    long len = fileInfo.lenght
    
    TreeView的实现是我参考了另一个WPF开发者,从网上下的一个demo.http://download.csdn.net/detail/xgr66/8585917
    源码下载:http://download.csdn.net/detail/iothua/9485116 下载需要5个资源分。
    
    
    
    
    展开全文
  • java语言实现操作系统中的文件管理系统

    万次阅读 多人点赞 2017-12-08 11:50:27
    用java语言模拟操作系统中的文件管理系统,文件模拟磁盘,数组模拟缓冲区,其中: 1. 支持多级目录结构,支持文件的绝对读路径; 2. 文件的逻辑结构采用流式结构,物理结构采用链接结构中的显式链接方式; 3. ...
  • DocSys - 基于Web的文件管理系统

    万次阅读 2018-11-19 14:05:42
    DocSys是基于Java SSM框架开发的Web文件系统,旨在为个人和企业用户提供一个简单、方便的文件存储方案,采用Windows桌面系统和Apple手机的用户操作习惯,支持使用SVN和GIT进行历史版本管理、支持文件内容全文搜索、...
  • 利用docker 搭建File Browser 文件管理系统 作者:sqtce2018-11-17来源:51CTO 他就是一个文件浏览器,因为linux并不方便桌面管理,所以Filebrowser就是帮助我们管理linux服务器上文件的程序,你可以称他为网盘...
  • 近期需要做一个web文件管理系统,主要实现权限管理以及文件管理,权限管理到目录级,类似于logicalDoc,文件该怎么存,权限怎么控制,还是比较迷茫,忘各位能给点思路,先行谢过。
  • seafile是一个开源的文件管理系统,同时支持windows和linux,我们将服务端搭建在linux上,整个搭建过程如下。
  • python 文件管理系统

    千次阅读 2018-01-18 21:39:23
    文件管理 # 1. open 内置函数打开文件, 返回值是一个文件对象 ; 默认文件打开方式为只读 'r'; f = open("/home/kiosk/hello") print type(f) # 2. 读取文件内容 f.read() # 3. 关闭文件 f.close() 文件操作的...
  • 网络文件管理系统

    千次阅读 2007-12-26 00:57:00
    网络文件管理系统(Struts+MySQL+JDBC)junjinkaka2007-12-26目的:通过构建网络文件系统,掌握在Eclipse下如何用Struts来开发一个Web工程开发环境1) 系统框架 用 户
  • HDFS文件管理系统

    万次阅读 2016-05-09 23:17:40
    所以针对文件,可以使用文件查看功能,目前支持文本文件和使用内置的key、value生成的序列文件读取 序列化文件读取及支持的内置键值对类型: /** * 读取序列文件 * * @param fileName * @param records *...
  • 摘要:数据库系统与人工管理和文件管理系统相比,数据库系统具有实现数据整体结构化,使数据高共享性、低冗余性、易扩充,数据具有更高的独立性,且数据由DBMS管统一管理与控制。   数据库整体结构...
  • 一个简单二级文件管理系统

    万次阅读 热门讨论 2010-04-22 12:38:00
    模拟一个简单二级文件管理系统设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。设计内容:模拟一个简单二级文件管理系统 一、实验...
  • Web文件管理系统

    千次阅读 2004-07-28 11:59:00
    Web文件管理系统 使用本系统,你可以直接建立一个网络文件管理系统,不需要注册任何组件。本系统主要功能有:用户注册、登录系统、管理用户、文件上传、文件下载、文件管理、帮助信息、友情连接 使用说明 如果你使用...
  • java实现的简单文件管理系统

    万次阅读 热门讨论 2007-10-26 13:57:00
    设计一个文件管理方案,模拟一个简单的文件管理系统。要求目录结构为树型结构,目录下可以是目录,也可以是文件。通过该实验是学生可以深刻理解文件系统的概念、所涉及的基本操作及实现时的主要数据结构。 
  • 一款不错的PHP在线文件管理系统,PHP WEBFTP,挺好用,推荐使用 名字:kodexplorer 官方地址:http://www.kalcaddle.com/
  • 一个不完整的文件管理系统

    千次阅读 2020-01-06 16:41:15
    于是我的系统终于可以发出来了,很久之前就想写一个文件系统,结果一直拖着,借着这次课设的机会,赶了一下 感兴趣的可以看一下我的githttps://github.com/ch98road/DFM 下为简介 主要功能 用户登陆 文件浏览 ...
  • 基于JFinal+AngularJs+Hadoop的WEB文件管理系统

    千次阅读 热门讨论 2014-03-06 00:34:00
    第一步肯定是搭建hadoop集群啦,我是采用VMwared...第二步:开始程序设计,搭建web框架,开始开发基于hadoop的云端文件管理系统 项目架构如下: 运行界面如下: 可以自行添加文件夹,也可以点击已有的云端文件夹,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 171,183
精华内容 68,473
关键字:

文件管理系统