Go之获取Windows下文件是否隐藏

起初,做了个小程序,用来检测磁盘中所有的文件

  1. package main
  2. import(
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. )
  7. var dirpath ="D:\\"
  8. func main(){
  9. CheckDir(dirpath)
  10. }
  11. func CheckDir(dirpath string){
  12. dirs, err := ioutil.ReadDir(dirpath)
  13. if err !=nil{
  14. panic("目录输入有误!")
  15. }
  16. for _, dir := range dirs {
  17. if dir.IsDir(){
  18. if dir.Name()=="System Volume Information"{
  19. fmt.Println("检测目录:", dirpath+"\\"+dir.Name(),"sys", dir.Sys())
  20. return
  21. }
  22. fmt.Println("检测目录:", dirpath+"\\"+dir.Name(),"sys", dir.Sys())
  23. CheckDir(dirpath +"\\"+ dir.Name())
  24. }else{
  25. fmt.Println("文件:", dirpath+"\\"+dir.Name(),"大小:", dir.Size())
  26. if dir.Size()==0{
  27. fmt.Println("删除文件:", dirpath+"\\"+dir.Name(), dir.Size())
  28. }
  29. }
  30. }
  31. }

输出结果为:

文件: D:\\My Documents\Downloads\wcftestclient_exe.rar 大小: 110608

检测目录: D:\\SoftDown sys &{16 {2081520578 30419524} {1134116594 30422735} {1134116594 30422735} 0 0}

文件: D:\\SoftDown\Sublime Text Build 3012 Setup.exe 大小: 7051120

检测目录: D:\\SoftDown\Vice.2015.720p.WEB-DL.DD5.1.H.264-PLAYNOW sys &{16 {753370423 30421925} {753410426 30421925} {753420426 30421925} 0 0}

文件: D:\\SoftDown\Vice.2015.720p.WEB-DL.DD5.1.H.264-PLAYNOW\Vice.2015.720p.WEB-DL.DD5.1.H.264-PLAYNOW.mkv.tdl 大小: 3255167129

文件: D:\\SoftDown\Vice.2015.720p.WEB-DL.DD5.1.H.264-PLAYNOW\f7a8aa8e2082c4ebe28f2c26cf16e4b08a27d5c1.torrent 大小: 31751

文件: D:\\SoftDown\Vice.2015.720p.WEB-DL.DD5.1.H.264-PLAYNOW.qud.cfg 大小: 556

文件: D:\\SoftDown\[iPlaySoft.com]VS2013_RTM_ULT_CHS.iso 大小: 3077509120

检测目录: D:\\System Volume Information sys &{22 {1206047926 30310737} {1206983927 30310737} {1206983927 30310737} 0 0}

panic: 目录输入有误!

goroutine 1 [running]:

main.CheckDir(0xc0820585c0, 0x1d)

F:/goproj/GitTest.git/trunk/src/WebSite/main.go:22 +0xde

main.CheckDir(0x4f3890, 0x3)

F:/goproj/GitTest.git/trunk/src/WebSite/main.go:28 +0x46a

main.main()

F:/goproj/GitTest.git/trunk/src/WebSite/main.go:15 +0xfc

这里会报一个异常

D:\\System Volume Information Microsoft的解答

本文介绍如何访问 System Volume Information 文件夹。System Volume Information 文件夹是一个隐藏的系统文件夹,系统还原工具使用此文件夹来存储它的信息和还原点。计算机的每个分区上都有一个 System Volume Information 文件夹。为了进行故障排除,可能需要访问此文件夹。

于是就要判断文件是否是隐藏文件,但是Golang api中并未直接给出这个IsHidden属性

调式源码得知:

os.Stat方法可以获取到一个FileInfo,于是写了如下代码

  1. fileinfo, _ := os.Stat(dirpath)
  2. sysifno := fileinfo.Sys()
  3. fmt.Println(sysifno)

  1. os.Stat
  2. os包中的func Lstat(name string) (fi FileInfo, err error)
  3. 通过fs,err:=&fileStat{name: basename(name)}这个初始化得到了一个FileInfo对象
    1. type fileStat struct{
    2. name string
    3. sys syscall.Win32FileAttributeData
    4. // used to implement SameFile
    5. sync.Mutex
    6. path string
    7. vol uint32
    8. idxhi uint32
    9. idxlo uint32
    10. }
    1. type Win32FileAttributeDatastruct{
    2. FileAttributes uint32
    3. CreationTimeFiletime
    4. LastAccessTimeFiletime
    5. LastWriteTimeFiletime
    6. FileSizeHigh uint32
    7. FileSizeLow uint32
    8. }

  4. 然后调用syscall.GetFileAttributesEx(namep, syscall.GetFileExInfoStandard, (*byte)(unsafe.Pointer(&fs.sys))) 将第3步中的fs传入次方法中,调用kernel32.dll的GetFileAttributes方法获取了文件属性
  5. kernel32.dll的GetFileAttributes方法返回值如下

    1. 在MSDN中,文件总共有15种属性,根据磁盘的分区格式不同,文件的属性也会不同。
    2. 现在针对GetFileAttributes函数的返回值做以下整理
    3. 返回字段
    4. 返回值
    5. 属性类型
    6. FILE_ATTRIBUTE_READONLY 1 只读
    7. FILE_ATTRIBUTE_HIDDEN 2     隐藏
    8. FILE_ATTRIBUTE_SYSTEM     4 系统
    9. FILE_ATTRIBUTE_DIRECTORY 16 目录
    10. FILE_ATTRIBUTE_ARCHIVE 32 存档
    11. FILE_ATTRIBUTE_DEVICE 64 保留
    12. FILE_ATTRIBUTE_NORMAL 128 正常
    13. FILE_ATTRIBUTE_TEMPORARY 256 临时
    14. FILE_ATTRIBUTE_SPARSE_FILE 512 稀疏文件
    15. FILE_ATTRIBUTE_REPARSE_POINT1024 超链接或快捷方式
    16. FILE_ATTRIBUTE_COMPRESSED 2048 压缩
    17. FILE_ATTRIBUTE_OFFLINE 4096 脱机
    18. FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 8192 索引
    19. FILE_ATTRIBUTE_ENCRYPTED 16384 加密
    20. FILE_ATTRIBUTE_VIRTUAL 65536 虚拟
    21. 橙色标记的属性为Windows系统中文件的公有属性,其中“只读”、“隐藏”、“系统”、“存档”为文件的四种基本属性。compressed,content_indexed,encrypted只存在于NTFS分区中。
    22. 文件去掉全部属性后(四种基本属性),将自动标记为normal。同时具有system和hidden属性的文件会在系统中彻底隐形,这也是病毒常用的伎俩。
    23. commpressed和encrypted不能共存。默认情况下文件都有content_indexed属性

这里就能够理解这里输出的

FileAttributes = 22

检测目录:D:\\System Volume Information sys &{22 {1206047926 30310737} {1206983927 30310737} {1206983927 30310737} 0 0}

22代表的是也就是

1 0 0 0 0 16 目录

1 0 0 4 系统

& 1 0 2 隐藏

------------

1 0 1 1 0 =22

代表此文件是隐藏文件

检测目录: D:\\SoftDown\Vice.2015.720p.WEB-DL.DD5.1.H.264-PLAYNOW sys &{16 {753370423 30421925} {753410426 30421925} {753420426 30421925} 0 0}

16 目录

这样就很明确了:也就是说如果二进制中倒数第二位为1,代表是隐藏目录(文件)

如此就能进行判断了

  1. package main
  2. import(
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. "reflect"
  7. "strconv"
  8. //"strconv"
  9. )
  10. var dirpath ="D:\\"
  11. func main(){
  12. CheckDir(dirpath)
  13. }
  14. func CheckDir(dirpath string){
  15. dirs, err := ioutil.ReadDir(dirpath)
  16. if err !=nil{
  17. panic("目录输入有误!")
  18. }
  19. for _, dir := range dirs {
  20. if dir.IsDir(){
  21. if!CheckIsHidden(dir){
  22. fmt.Println("检测目录:", dirpath+"\\"+dir.Name())
  23. CheckDir(dirpath +"\\"+ dir.Name())
  24. }
  25. }else{
  26. fmt.Println("文件:", dirpath+"\\"+dir.Name(),"大小:", dir.Size())
  27. if dir.Size()==0{
  28. fmt.Println("删除文件:", dirpath+"\\"+dir.Name(), dir.Size())
  29. }
  30. }
  31. }
  32. }
  33. func CheckIsHidden(file os.FileInfo)bool{
  34. //"通过反射来获取Win32FileAttributeData的FileAttributes
  35. fa := reflect.ValueOf(file.Sys()).Elem().FieldByName("FileAttributes").Uint()
  36. bytefa :=[]byte(strconv.FormatUint(fa,2))
  37. if bytefa[len(bytefa)-2]==‘1‘{
  38. fmt.Println("隐藏目录:", file.Name())
  39. returntrue
  40. }
  41. returnfalse
  42. }

来自为知笔记(Wiz)

时间: 2024-09-30 12:58:36

Go之获取Windows下文件是否隐藏的相关文章

windows下自动启动Redis隐藏命令行窗口

这段时间看了看关于Redis的相关内容,对于Redis在windows下的安装和常规启动我就不多说了.可以参考其他的博客http://www.cnblogs.com/edisonchou/p/3821228.html.我按照这篇博客的方法添加启动Redis的windows服务,但是在启动服务的时候,会报错:错误1053:服务没有及时响应启动或控制请求.如下图: 我查了相关资料,有的人说是因为windows8系统权限问题.我就想能不能绕过这个错误,实现自动启动Redis,而不用再命令行中启动. 一

linux获取目录下文件

查看当前目录下的文件:find . -type f查看当前目录下的文件夹: find . -type d如果文件file1不为空: if [ -s file1 ];then       echo "file1 不为空"fi #!/bin/sh for f in `find ./testdir -type f`; do         if [ -s $f ];then                 echo $f is not empty.                 echo 

windows 下文件上传到fastdfs

php.ini 配置 [fastdfs]; the base pathfastdfs_client.base_path = D:/tmp; connect timeout in seconds; default value is 30sfastdfs_client.connect_timeout = 2; network timeout in seconds; default value is 30sfastdfs_client.network_timeout = 60 ; standard l

Perl获取目录下文件或者包含子目录下文件

1 my $dir = "D:\\My_Work\\Temp"; 2 my @files = (); 3 4 #获取给定目录下文件 5 @files = get_dir_files($dir); 6 7 #获取给定目录以及子目录下文件 8 @files = get_dir_files_x($dir); 9 10 #获取目录下以及子目录下文件,返回的结果中包含路径 11 sub get_dir_files_x{ 12 my ($dir_p) = @_; 13 my @files = ()

使用cwRsync实现windows下文件定时同步【转】

1.参考文献: 使用cwRsync实现windows下文件定时同步(备份) 文件同步工具CwRsync的使用方法及常用命令详解 2.背景: 当前的SCADA架构中,有1台Server,5台FE,还有1台Client.其架构如下图所示: 虽然叫法不同,但是他们的安装文件和配置文件是完全一样的.并且大多数情况下,也建议这些服务器上面的配置文件保持一致,这样只需要维护一个版本的config即可,不需要个性化定义每台服务器上面的config文件.由此也带来了一个新的问题,每当我在一台机器上面修改了配置文

spring java 获取webapp下文件路径

spring java 获取webapp下文件路径 @RequestMapping("/act/worldcup_schedule_time/imgdownload") @ResponseBody public String scheduleDownload(HttpServletRequest request, HttpServletResponse response, HttpSession session) { response.setCharacterEncoding(&quo

使用cwRsync实现windows下文件定时同步

1.参考文献: 使用cwRsync实现windows下文件定时同步(备份) 文件同步工具CwRsync的使用方法及常用命令详解 2.背景: 当前的SCADA架构中,有1台Server,5台FE,还有1台Client.其架构如下图所示: 虽然叫法不同,但是他们的安装文件和配置文件是完全一样的.并且大多数情况下,也建议这些服务器上面的配置文件保持一致,这样只需要维护一个版本的config即可,不需要个性化定义每台服务器上面的config文件.由此也带来了一个新的问题,每当我在一台机器上面修改了配置文

python生成器 获取 目录下文件

# os.walk()和os.list 都是得到所有文件的列表, 如果目录下文件特别多, 上亿了, 我们就需要生成器的方式获取 # 要求目录下面没有目录, 会递归到子目录下面找文件, (如果有子目录可以在下面代码基础上做修改) def gen_file(path, per_file_count): # 目录和一次想要回去的文件数量 i = 0 scandir_it = scandir(path) # 递归获取目录下文件, 返回迭代器 while True: try: entry = next(s

windows下文件夹遍历

文件夹的操作,是我们在编程中经常遇到的问题,在linux上和windows上经常会有文件夹操作的需求,典型的例子如遍历文件夹中的所有文件,在这两个系统中文件夹操作所提供的API也有所不同. 最近我老婆向我提了一个需求,便于她管理文件夹:开发一个exe,将exe放入一个目录下,点击该exe,生成这个目录下所有文件的清单,文件夹用"[]"括起来,同时根据文件级别进行缩进. 这个需求实现起来不难,用到的知识就是文件夹的遍历,在windows上使用的是windows相关的API函数,主要有用到