在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
起初,做了个小程序,用来检测磁盘中所有的文件 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,于是写了如下代码
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 }
这里就能够理解这里输出的 FileAttributes = 22 检测目录:D:\\System Volume Information sys &{22 {1206047926 30310737} {1206983927 30310737} {1206983927 30310737} 0 0}
检测目录: D:\\SoftDown\Vice.2015.720p.WEB-DL.DD5.1.H.264-PLAYNOW sys &{16 {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 }
|
请发表评论