Go之获取Windows下文件是否隐藏
起初,做了个小程序,用来检测磁盘中所有的文件
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)
- os.Stat
- os包中的func Lstat(name string) (fi FileInfo, err error)
- 通过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方法返回值如下
在MSDN中,文件总共有15种属性,根据磁盘的分区格式不同,文件的属性也会不同。现在针对GetFileAttributes函数的返回值做以下整理返回字段返回值属性类型FILE_ATTRIBUTE_READONLY1 只读FILE_ATTRIBUTE_HIDDEN2 隐藏FILE_ATTRIBUTE_SYSTEM4 系统FILE_ATTRIBUTE_DIRECTORY16 目录FILE_ATTRIBUTE_ARCHIVE32 存档FILE_ATTRIBUTE_DEVICE64 保留FILE_ATTRIBUTE_NORMAL128 正常FILE_ATTRIBUTE_TEMPORARY256 临时FILE_ATTRIBUTE_SPARSE_FILE512 稀疏文件FILE_ATTRIBUTE_REPARSE_POINT1024 超链接或快捷方式FILE_ATTRIBUTE_COMPRESSED2048 压缩FILE_ATTRIBUTE_OFFLINE4096 脱机FILE_ATTRIBUTE_NOT_CONTENT_INDEXED8192 索引FILE_ATTRIBUTE_ENCRYPTED16384 加密FILE_ATTRIBUTE_VIRTUAL65536 虚拟橙色标记的属性为Windows系统中文件的公有属性,其中“只读”、“隐藏”、“系统”、“存档”为文件的四种基本属性。compressed,content_indexed,encrypted只存在于NTFS分区中。文件去掉全部属性后(四种基本属性),将自动标记为normal。同时具有system和hidden属性的文件会在系统中彻底隐形,这也是病毒常用的伎俩。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}
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下文件是否隐藏的更多相关文章
- C# 获取目录下文件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- spring java 获取webapp下文件路径
spring java 获取webapp下文件路径 @RequestMapping("/act/worldcup_schedule_time/imgdownload") @Resp ...
- java 获取classpath下文件多种方式
java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...
- 使用cwRsync实现windows下文件定时同步【转】
1.参考文献: 使用cwRsync实现windows下文件定时同步(备份) 文件同步工具CwRsync的使用方法及常用命令详解 2.背景: 当前的SCADA架构中,有1台Server,5台FE,还有1 ...
- 获取WINDOWS特殊文件夹
const// registry entries for special paths are kept in : REGSTR_PATH_SPECIAL_FOLDERS = REGSTR_PAT ...
- python生成器 获取 目录下文件
# os.walk()和os.list 都是得到所有文件的列表, 如果目录下文件特别多, 上亿了, 我们就需要生成器的方式获取 # 要求目录下面没有目录, 会递归到子目录下面找文件, (如果有子目录可 ...
- 解决Windows下文件在Linux下打开出现乱码的问题
目录 问题 原理 解决 总结 参考资料 问题 前几天生病了,Java一直在看代码但是没跟着打,于是决定偷一波小小的懒,直接把教材的代码从Windows通过共享文件夹放到了Linux里面.但是编译的时候 ...
- 使用cwRsync实现windows下文件定时同步
1.参考文献: 使用cwRsync实现windows下文件定时同步(备份) 文件同步工具CwRsync的使用方法及常用命令详解 2.背景: 当前的SCADA架构中,有1台Server,5台FE,还有1 ...
- python使用wmi模块获取windows下的系统信息监控系统-乾颐堂
Python用WMI模块获取Windows系统的硬件信息:硬盘分区.使用情况,内存大小,CPU型号,当前运行的进程,自启动程序及位置,系统的版本等信息. 本文实例讲述了python使用wmi模块获取w ...
随机推荐
- ECS Linux服务器xfs磁盘扩容
ECS Linux服务器xfs磁盘扩 ECS Linux服务器xfs磁盘使用阿里云官方提供的磁盘扩容方法扩容会有报错: [root@iZ28u04wmy2Z ~]# e2fsck /dev/xvdb1 ...
- linq操作符:转换操作符
这些转换操作符将集合转换成数组:IEnumerable.IList.IDictionary等.转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以"As"开头的转换方法可更 ...
- MVC教程九:异常过滤器
我们平常在程序里面为了捕获异常,会加上try-catch-finally代码,但是这样会使得程序代码看起来很庞大,在MVC中我们可以使用异常过滤器来捕获程序中的异常,如下图所示: 使用了异常过滤器以后 ...
- 看见- 柴静-kindle书摘
笔记本导出 看见 柴静 序 言 标注(黄色) - 位置 3 关心新闻中的人—— 标注(黄色) - 位置 36 二〇〇〇年,我还是湖南卫视“新青年”主持人, 第一章 / 别当了主持人就不是人了 标注(黄 ...
- Java设计模式(5)共享模式/享元模式(Flyweight模式)
Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可 ...
- [hadoop读书笔记] 第四章 Hadoop I/O操作
P92 压缩 P102 序列化 序列化:将结构化对象转为字节流便于在网上传输或写到磁盘进行永久性存储的过程 用于进程之间的通信或者数据的永久存储 反序列化:将字节流转为结构化对象的逆过程 Hadoop ...
- 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 ...
- qualcomm compile instructions
qualcomm编译指令 Compile the Entire Android Software source build/envsetup.sh lunch msm8909-userdebug ma ...
- c# WebBrowser获取cookie
private void BtnOpenUrl_Click(object sender, EventArgs e) { if (txtUrl.Text != "") { Myweb ...
- CI框架 -- 网页缓存
CodeIgniter 可以让你通过缓存页面来达到更好的性能. 尽管 CodeIgniter 已经相当高效了,但是网页中的动态内容.主机的内存 CPU 和数据库读取速度等因素直接影响了网页的加载速度. ...