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

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. PHP调用JAVA的WebService简单实例

    使用PHP调用JAVA语言开发的WebService.客户端提交两个String类型的参数,服务端返回一个对象类型.服务端使用AXIS-1.4作为SOAP引擎.客户端为PHP5.2.9,使用NuSOA ...

  2. 【C】——动态库中函数的作用范围

    如何生成动态库 net小伙 已经在此文中说明——[C]——如何生成静态库和动态库:接下来就要看看动态库中函数的作用范围: 首先我们使用命令   gcc -fPIC -shared -o libtest ...

  3. git基本操作:使用git将本地代码上传到GitHub

    一.创建github repository(仓库) 1.登录GitHub 创建GitHub仓库,首先需要登录GitHub,GitHub网址:https://github.com.如果没有GitHub账 ...

  4. 请教 JTable 里的单元格如何使得双击进入单元格后,单元格的内容处于全选中状态

    http://bbs.csdn.net/topics/390195204 ———————————————————————————————————————— java 达人, 最近在开发一个 java  ...

  5. [Intellij] Intellij IDEA 使用中遇见的问题

    问题集锦 [IntelliJ IDEA14 + tomcat 设置热部署] 点击deployment查看Deploy at the server startup 中tomcat每次所运行的包是 xxx ...

  6. android 在HTML中显示bitmap

    逻辑:将bitmap转化为Base64,通过调用HTML中的JS,显示到HTML中 (1)android代码 public String bitmaptoString(Bitmap bitmap) { ...

  7. python递归评论tree形图代码

    首先我有必要记录下来这段代码,因为我遇到了这个问题, 然后没有解决 后来, 前段说我找到一段代码给我看看, 我并没有在意, 然后她实现了, 她实现了,她真的实现了, 我... 为了感谢她,我陪她玩了一 ...

  8. 关于Python的装饰器 decorator

    装饰器的原理:其实就是高阶函数,接收原函数以在之前之后进行操作. 语法格式是固定的:先定义一个函数,再使用@语法调用该函数. 例子一: import functools # 定义装饰器,固定格式 de ...

  9. ZBar与ZXing使用后感觉

    [原]ZBar与ZXing使用后感觉(上) 2014-3-18阅读2011 评论1 最近对二维码比较感兴趣,还是那句老话,那么我就对比了一下zxing和zbar 如果对于这两个的背景不了解的话,可以看 ...

  10. Maven 构建生命周期

    构建生命周期是什么? 构建生命周期阶段的目标是执行顺序是一个良好定义的序列.这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段: 阶段 处理 描述 准备资源 资源复制 资源复制可 ...