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

package main
import(
  "fmt"
  "io/ioutil"
  "os"
)
var dirpath ="D:\\"
func main(){
  CheckDir(dirpath)
}
func CheckDir(dirpath string){
  dirs, err := ioutil.ReadDir(dirpath)
  if err !=nil{
    panic("目录输入有误!")
  }
  for _, dir := range dirs {
    if dir.IsDir(){
    if dir.Name()=="System Volume Information"{
      fmt.Println("检测目录:", dirpath+"\\"+dir.Name(),"sys", dir.Sys())
      return
    }
    fmt.Println("检测目录:", dirpath+"\\"+dir.Name(),"sys", dir.Sys())
      CheckDir(dirpath +"\\"+ dir.Name())
    }else{
        fmt.Println("文件:", dirpath+"\\"+dir.Name(),"大小:", dir.Size())
        if dir.Size()==0{
        fmt.Println("删除文件:", dirpath+"\\"+dir.Name(), dir.Size())
       }
    }
  }
}
 
输出结果为:

文件: 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,于是写了如下代码

      fileinfo, _ := os.Stat(dirpath)

      sysifno := fileinfo.Sys()

      fmt.Println(sysifno)

    1. os.Stat
    2. os包中的func Lstat(name string) (fi FileInfo, err error)
    3. 通过fs,err:=&fileStat{name: basename(name)}这个初始化得到了一个FileInfo对象
          type fileStat struct{
              name string
              sys syscall.Win32FileAttributeData
              // used to implement SameFile
              sync.Mutex
              path string
              vol uint32
              idxhi uint32
              idxlo uint32
            }
          type Win32FileAttributeDatastruct{
              FileAttributes uint32
              CreationTimeFiletime
              LastAccessTimeFiletime
              LastWriteTimeFiletime
              FileSizeHigh uint32
              FileSizeLow uint32
            }
  • 然后调用syscall.GetFileAttributesEx(namep, syscall.GetFileExInfoStandard, (*byte)(unsafe.Pointer(&fs.sys))) 将第3步中的fs传入次方法中,调用kernel32.dll的GetFileAttributes方法获取了文件属性
  • 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 =

检测目录:D:\\System Volume Information sys &{ {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 &{ {753370423 30421925} {753410426 30421925} {753420426 30421925} 0 0}

        16 目录
这样就很明确了:也就是说如果二进制中倒数第二位为1,代表是隐藏目录(文件)
如此就能进行判断了
package main
import(
    "fmt"
    "io/ioutil"
    "os"
    "reflect"
    "strconv"
)
var dirpath ="D:\\"
func main(){
    CheckDir(dirpath)
}
func CheckDir(dirpath string){
  dirs, err := ioutil.ReadDir(dirpath)
  if err !=nil{
      panic("目录输入有误!")
  }
  for _, dir := range dirs {
    if dir.IsDir(){
      if!CheckIsHidden(dir){
        fmt.Println("检测目录:", dirpath+"\\"+dir.Name())
        CheckDir(dirpath +"\\"+ dir.Name())
      }
    }else{
      fmt.Println("文件:", dirpath+"\\"+dir.Name(),"大小:", dir.Size())
      if dir.Size()==0{
        fmt.Println("删除文件:", dirpath+"\\"+dir.Name(), dir.Size())
      }
    }
  }
}
func CheckIsHidden(file os.FileInfo)bool{
//"通过反射来获取Win32FileAttributeData的FileAttributes
    fa := reflect.ValueOf(file.Sys()).Elem().FieldByName("FileAttributes").Uint()
    bytefa :=[]byte(strconv.FormatUint(fa,2))
    if bytefa[len(bytefa)-2]=='1'{
      fmt.Println("隐藏目录:", file.Name())
      return true
    }
    return false
}

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

  1. C# 获取目录下文件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. spring java 获取webapp下文件路径

    spring java 获取webapp下文件路径 @RequestMapping("/act/worldcup_schedule_time/imgdownload") @Resp ...

  3. java 获取classpath下文件多种方式

    java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...

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

    1.参考文献: 使用cwRsync实现windows下文件定时同步(备份) 文件同步工具CwRsync的使用方法及常用命令详解 2.背景: 当前的SCADA架构中,有1台Server,5台FE,还有1 ...

  5. 获取WINDOWS特殊文件夹

    const// registry entries for special paths are kept in :  REGSTR_PATH_SPECIAL_FOLDERS   = REGSTR_PAT ...

  6. python生成器 获取 目录下文件

    # os.walk()和os.list 都是得到所有文件的列表, 如果目录下文件特别多, 上亿了, 我们就需要生成器的方式获取 # 要求目录下面没有目录, 会递归到子目录下面找文件, (如果有子目录可 ...

  7. 解决Windows下文件在Linux下打开出现乱码的问题

    目录 问题 原理 解决 总结 参考资料 问题 前几天生病了,Java一直在看代码但是没跟着打,于是决定偷一波小小的懒,直接把教材的代码从Windows通过共享文件夹放到了Linux里面.但是编译的时候 ...

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

    1.参考文献: 使用cwRsync实现windows下文件定时同步(备份) 文件同步工具CwRsync的使用方法及常用命令详解 2.背景: 当前的SCADA架构中,有1台Server,5台FE,还有1 ...

  9. python使用wmi模块获取windows下的系统信息监控系统-乾颐堂

    Python用WMI模块获取Windows系统的硬件信息:硬盘分区.使用情况,内存大小,CPU型号,当前运行的进程,自启动程序及位置,系统的版本等信息. 本文实例讲述了python使用wmi模块获取w ...

随机推荐

  1. ECS Linux服务器xfs磁盘扩容

    ECS Linux服务器xfs磁盘扩 ECS Linux服务器xfs磁盘使用阿里云官方提供的磁盘扩容方法扩容会有报错: [root@iZ28u04wmy2Z ~]# e2fsck /dev/xvdb1 ...

  2. linq操作符:转换操作符

    这些转换操作符将集合转换成数组:IEnumerable.IList.IDictionary等.转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以"As"开头的转换方法可更 ...

  3. MVC教程九:异常过滤器

    我们平常在程序里面为了捕获异常,会加上try-catch-finally代码,但是这样会使得程序代码看起来很庞大,在MVC中我们可以使用异常过滤器来捕获程序中的异常,如下图所示: 使用了异常过滤器以后 ...

  4. 看见- 柴静-kindle书摘

    笔记本导出 看见 柴静 序 言 标注(黄色) - 位置 3 关心新闻中的人—— 标注(黄色) - 位置 36 二〇〇〇年,我还是湖南卫视“新青年”主持人, 第一章 / 别当了主持人就不是人了 标注(黄 ...

  5. Java设计模式(5)共享模式/享元模式(Flyweight模式)

    Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可 ...

  6. [hadoop读书笔记] 第四章 Hadoop I/O操作

    P92 压缩 P102 序列化 序列化:将结构化对象转为字节流便于在网上传输或写到磁盘进行永久性存储的过程 用于进程之间的通信或者数据的永久存储 反序列化:将字节流转为结构化对象的逆过程 Hadoop ...

  7. Enums and Lookup Tables with EF Code First

    With EntityFramework’s support for enums, there is no longer any need to include lookup tables in th ...

  8. qualcomm compile instructions

    qualcomm编译指令 Compile the Entire Android Software source build/envsetup.sh lunch msm8909-userdebug ma ...

  9. c# WebBrowser获取cookie

    private void BtnOpenUrl_Click(object sender, EventArgs e) { if (txtUrl.Text != "") { Myweb ...

  10. CI框架 -- 网页缓存

    CodeIgniter 可以让你通过缓存页面来达到更好的性能. 尽管 CodeIgniter 已经相当高效了,但是网页中的动态内容.主机的内存 CPU 和数据库读取速度等因素直接影响了网页的加载速度. ...