当前位置: 首页 > 软件库 > 服务器软件 > 存储系统 >

dokan

用户态的文件系统驱动
授权协议 LGPL/MIT/GPL
开发语言 C/C++
所属分类 服务器软件、 存储系统
软件类型 开源软件
地区 不详
投 递 者 华欣荣
操作系统 Windows
开源组织
适用人群 未知
 软件概览

dokan是用户态的文件系统驱动,可以称之为fuse for windows。可以用来开发虚拟磁盘,即在“我的电脑”中虚拟出一个硬盘来,可以是硬盘,也可以是可移动磁盘或者网络硬盘。

CreateFile、FindFiles、GetFileInformation需要最优先实现,有了这两个接口,就可以浏览目录了。

进入CreateFile,需要判断请求的虚拟文件是目录还是文件,如果是目录,则需要设置 DokanFileInfo->IsDirectory为True,并直接返回成功。虚拟文件的打开可以根据 CreationDisposition、AccessMode、ShareMode三者组合。最简单的做法是在最开始处对做判断,因为它只有五种可能 性,把文件不存在,但却需要以只读打开的都排除,然后就可以放心地应用:读使用”rb+”, 写使用”wb+”。

Create中返回的文件描述符或者类似的数据可以保存DokanFileInfo->context中,这个值可以在以后的其它函数调用中 访问到:比如CloseFile, CleanUp, DeleteFile, ReadFile, WriteFile等等。

CreateDirectory和实际的文件操作一致。
OpenDirectory一般直接返回成功,除非目录无访问权限,可以人为地返回-1。
CloseFile用处不大,因为在CloseFile之前,有一道CleanUp调用,已经清除了打开的文件。
CleanUp和CloseFile好像会被一前一后地调用,在CleanUp中需要做的事情是根据DokanFileInfo->context 保存的值关闭虚拟文件。并且DokanFileInfo->DeleteOnClose如果为True,则需要把当前请求的文件或者目录删除。文件 删除的动作实际是在Cleanup中实现的。

DeleteDirectory和DeleteFile两个接口实现中,不能够真正去删除文件,而是在文件或者目录需要删除时,返回0即可,系统会继续调用上面说的cleanup来处理删除事件。

在文件的删除时,有可能操作系统传递过来的请求文件并未被关闭,但好在同时DokanFileInfo->context也会被一同传递来,所以可以先强行关闭打开的文件,然后做删除操作。

操作系统的应用程序每次读写文件都是通过ReadFile、WriteFile接口完成的,一般情况下一次求请的大小比较小,比如 65535Bytes等,但也有例外,比如使用FastCopy等多线程文件快速复制工具时,它会直接向ReadFile请求32MB的大小。

ReadFile WriteFile一般情况下都会有DokanFileInfo->context参数传进来,就像平常我们写文件读写的代码一样,总是先 fopen个FILE*出来,然后再读写。 但是也有例外,比如记事本在读文件的时候,就只是给个路径+文件名。 这个时候,需要在ReadFile WriteFile临时专门为这一次请求打开文件,在退出函数时,一定要关闭它。

FlushFileBuffers是个没用的东西,可以不实现。

GetFileInformation非常重要,资源管理器每次打开目录时,会查询当前目录每个文件的信息。如果给出的信息不恰当,比如文件时间如 果是个变化的值(比如图省事,将所以文件的时间设置为当前时间),这样会导致系统不断地查询,非常的恐怖。 在返回的dwFileAttributes中,需要小心地设置文件类型,文件和目录千万要区别正确。 试过FILE_ATTRIBUTE_NORMAL+FILE_ATTRIBUTE_ARCHIVE-FILE_ATTRIBUTE_ENCRYPTED以 及FILE_ATTRIBUTE_DIRECTORY就基本正常工作了,FILE_ATTRIBUTE_ENCRYPTED一定要去掉,不然系统会认为你 虚拟出来的盘符是加密的,往其它盘复制文件时会提示不能处理加密文件而直接失败。

FindFiles函数中,我们需要用传递进来的函数指针FillFindData将我们需要显示的目录和文件填充到系统为我们准备好的地方。只要 文件的属性dwFileAttributes像样,可以构造虚拟文件和目录(比如可以将数据库里的用户和组记录读出来,表示成一层层的目录)。

MoveFile就是移动文件及改名,没什么特殊的地方。

SetEndOfFile一般情况下使用不到,但是如果有软件调用了这个API则还是有用的,比如像fastCopy,为了尽可能地加快复制速度, 它每次从内存将固定大小的数据保存到硬盘,比如大小为31MB的文件,实际上它写了32MB(文件尾部的数据其实是多余的),这是用readFile WriteFile实现的。但它最后会根据原文件的真实大小来做一次setEndOfFile将其裁剪到正确的大小。如果不实现 setEndOfFile,fastcopy就没用了。

SetFileAttributes和SetFileTime如果不想实现,就让它返回0,最好不要为了禁用这两个api.因为像Word之类的软 件,它很在意这两个函数,在保存文件时候不厌其烦地调用,所以为了让Word在虚拟盘上工作正常,必须忽悠它,否则不能保存做过编辑的文档。

GetDiskFreeSpace是返回驱动器的容量信息的,比如虚拟盘可以做容量限制。
GetVolumeInformation返回驱动器的卷标和文件系统类型,可以随便设置,文件类型可以随便取名,比如“XX文件系统”,和NTFS/FAT32是同等地位的。

GetFileInformation 有时候传递过来的DokanFileInfo->context不是空的,所以一定要使用它来查询文件大小。 假设DokanFileInfo->context保存的是fopen打开的fd, 如果使用传递过来的文件名去GetFileAttribute或者Stat()真实文件,有可能会因为缓存的缘故查询到的文件大小不是实时的。这一点在对 文件大小变化敏感的软件上特别重要,比较变态的Word,在保存的时候,它会先保存到临时文件,保存过程中,写一点数据,马上查询文件大小是否有变化是否 和写的数据大小一致。如果这时GetFIleInformation马马虎虎地返回个大小,Word就罢工了,它会以为当前磁盘是不稳定的,或者容量比较 用光,而拒绝保存。

  • Linux下利用fuse实现文件系统 (1)fuse库的下载地址:下载链接 (2)#tar -xzvf fuse-xx.xx.xx.tar.gz #cd fuse-xx.xx.xx (进入目录,下述命令需要在该目录下执行) 安装编译: #./configure --prefix=/usr (设定安装目录) #sudo make #sudo make install #cp ~/fuse-xx.xx

  • 因工作需要,最近与同事合作使用Dokan开发了一个虚拟磁盘的简单程序,初步实现了远程目录映射到本地虚拟磁盘的功能。     远程服务端是用Python写的,主要是将远程主机上的目录文件传给客戶端,在这里就不细说了。     Dokan客户端则由Delphi开发,其参考代码来自网络上的Delphi例子,比如Mirror Driver。     本篇文章主要是Dokan开发过程的一些总结,所以不会对D

  • Dokan:Windows下的mount命令 http://dokan.github.io 原始帖子:http://www.aiseminar.cn/bbs/forum.php?mod=viewthread&tid=1825 Dokan Library 帮助程序员在windows系统下轻松建立用户级文件系统,不需要写设备驱动,其与FUSE(Linux user mode file system)类

  • dokan是用户态的文件系统驱动,可以称之为fuse for windows。可以用来开发虚拟磁盘,即在“我的电脑”中虚拟出一个硬盘来,可以是硬盘,也可以是可移动磁盘或者网络硬盘。 CreateFile、FindFiles、GetFileInformation需要最优先实现,有了这两个接口,就可以浏览目录了。 进入CreateFile,需要判断请求的虚拟文件是目录还是文件,如果是目录,则需要设置D

  • dokan是用户态的文件系统驱动,可以称之为fuse for windows。可以用来开发虚拟磁盘,即在“我的电脑”中虚拟出一个硬盘来,可以是硬盘,也可以是可移动磁盘或者网络硬盘。 CreateFile、FindFiles、GetFileInformation需要最优先实现,有了这两个接口,就可以浏览目录了。 进入CreateFile,需要判断请求的虚拟文件是目录还是文件,如果是目录,则需要设置D

  •   dokan是用户态的文件系统驱动,可以称之为fuse for windows。可以用来开发虚拟磁盘,即在“我的电脑”中虚拟出一个硬盘来,可以是硬盘,也可以是可移动磁盘或者网络硬盘。 CreateFile、FindFiles、GetFileInformation需要最优先实现,有了这两个接口,就可以浏览目录了。 进入CreateFile,需要判断请求的虚拟文件是目录还是文件,如果是目录,则需要设

  • http://dokan.github.io 原始帖子:http://www.aiseminar.cn/bbs/forum.php?mod=viewthread&tid=1825 Dokan Library 帮助程序员在windows系统下轻松建立用户级文件系统,不需要写设备驱动,其与FUSE(Linux user mode file system)类似。 Dokan官网: http://doka

  • 本指南主要用于一步步引导如何使用使用vs2015编译出dokan1.0.1,并测试使用mirror例子,物料见云盘分享链接http://url.cn/43OPrKf 1.准备一台PC(建议配置4核16G),并使用virtulbox虚拟机出两台win7SP1的虚拟机(一台配置4核8G,一台配置4核4G)。 2.在4核8G的虚拟机上安装vs2005, SDK10, WDK10(物料分别为vs2015.

  • 译自:Unsupported 源网站:新发现小站 不支持的驱动器功能 FSCTL 不支持的操作系统 Windows Vista 适用于 <= 0.6.0 的 Dokan 版本 Windows XP 适用于 <= 0.6.0 的 Dokan 版本 Windows 2000 可选择的方案 如果上面提到的某个点严重影响了你的项目,这里有三个解决方案: 等待 如果你有时间的话,把你需要的功能放到 issu

  • Windows平台下的Dokan类似于Linux平台下的FUSE文件系统开发,使用Dokan进行文件系统的开发可以按照用户的需求自定义,并且整个过程不需要用户去实现Windows底层硬件驱动文件的设计,Dokan已经帮用户实现了对Windows底层硬件的调用,用户只需要安装Dokan file system driver (dokan1.sys) register Dokan mount serv

 相关资料
  • 当某个文件系统客户端不响应或者有其它异常行为时,有必要强制切断它到文件系统的访问,这个过程就叫做驱逐。 这个过程有点过头,它是为了防止异常客户端导致数据不一致。 OSD 黑名单机制 首先,把此客户端加入黑名单以防止此它在 RADOS 级再操作任何数据。你可能熟悉这个概念,它在其它存储系统里叫做隔离栏( fencing )。 找出要从 MDS 会话列表中驱逐的客户端: # ceph daemon m

  • 要挂载 Ceph 文件系统,如果你知道监视器 IP 地址可以用 mount 命令、或者用 mount.ceph 工具来自动解析监视器 IP 地址。例如: sudo mkdir /mnt/mycephfs sudo mount -t ceph 192.168.0.1:6789:/ /mnt/mycephfs 要挂载启用了 cephx 认证的 Ceph 文件系统,你必须指定用户名、密钥。 sudo m

  • 问题内容: 我正在尝试通过系统调用或子流程来实现事件驱动的流程。基本上,我想启动一个非阻塞系统命令,并且在该系统调用完成后,我希望一个函数被调用。这样一来,我可以启动GUI进度栏,启动系统命令并使进度栏继续运行,并在系统调用结束时停止进度栏。 我绝对不希望做的是生成一个进程,获取其进程ID,并在while循环中继续检查该进程的完成情况。 下面只是一个我如何想象它应该工作的示例(所有这些都在一个类中

  • 上篇末尾有个地方说错了,分时调度的yield过程应该是: env.running_queue.add(this); this.stat = STAT_YIELD; return; 需要将this加入到running_queue,否则这个线程就死了 有了分时调度,就可以实现计算密集型的程序的并发执行,不过绝大多数程序显然不是这种,程序多多少少都会进入阻塞等待,比如IO,锁,sleep等

  • 更多面试题总结请看:【面试题】技术面试题汇总 为何要区分用户态和内核态 最简单的运行程序的方式是“直接执行”,即直接在 CPU 上执行任意程序。直接执行的问题是: 如何限制代码行为?比如禁止:设置特殊寄存器的值、访问存储器的任意位置、I/O 请求、申请更多系统资源等 在运行这个程序的时候,如何切换到另一个程序?进程调度应该是 OS 才有的权限 因此引入用户态和内核态和两种模式。用户态无法执行受限操

  • Ceph v0.55 及后续版本默认开启了 cephx 认证。从用户空间( FUSE )挂载一 Ceph 文件系统前,确保客户端主机有一份 Ceph 配置副本、和具备 Ceph 元数据服务器能力的密钥环。 在客户端主机上,把监视器主机上的 Ceph 配置文件拷贝到 /etc/ceph/ 目录下。 sudo mkdir -p /etc/ceph sudo scp {user}@{server-mac