Golang : How to check if a file is hidden?
So, how to check if a file is hidden? The solutions below are OS dependent. One for Unix/Linux and another for Windows. It is pretty straightforward to check if a file is hidden under Linux/Unix, but more complicated under Windows.
For Linux/Unix:
package main
import (
"fmt"
"log"
"os"
"runtime"
)
func IsHidden(filename string) (bool, error) {
if runtime.GOOS != "windows" {
// unix/linux file or directory that starts with . is hidden
if filename[0:1] == "." {
return true, nil
} else {
return false, nil
}
} else {
log.Fatal("Unable to check if file is hidden under this OS")
}
return false, nil
}
func main() {
if len(os.Args) != 2 {
fmt.Printf("Usage : %s <filename>\n", os.Args[0])
os.Exit(0)
}
filename := os.Args[1]
result, err := IsHidden(filename)
if err != nil {
log.Println(err)
}
log.Println("["+filename+"]", "is hidden? ", result)
}
Sample output:
$ ./fileishidden .vscode
2017/04/26 10:35:10 .vscode is hidden? true
$ ./fileishidden work
2017/04/26 10:35:58 [work] is hidden? false
$ ./fileishidden .themes
2017/04/26 10:36:03 [.themes] is hidden? true
NOTE: I'd tried to build a cross-platform solution, but compiling the code below under Linux will generate these errors:
# command-line-arguments
./fileishiddenwindows.go:18: undefined: syscall.UTF16PtrFromString
./fileishiddenwindows.go:22: undefined: syscall.GetFileAttributes
./fileishiddenwindows.go:26: undefined: syscall.FILE_ATTRIBUTE_HIDDEN
However, everything is fine when compiling under Windows. Somehow, the Windows related functions are not available under Linux. Maybe changing the target platform will be helpful.
For Windows:
package main
import (
// use golang.org/x/sys/windows package in case syscall package has missing
// GetFileAttributes
//"golang.org/x/sys/windows"
"fmt"
"log"
"os"
"runtime"
"syscall"
)
func IsHidden(filename string) (bool, error) {
if runtime.GOOS == "windows" {
pointer, err := syscall.UTF16PtrFromString(filename)
if err != nil {
return false, err
}
attributes, err := syscall.GetFileAttributes(pointer)
if err != nil {
return false, err
}
return attributes&syscall.FILE_ATTRIBUTE_HIDDEN != 0, nil
} else {
log.Fatal("Unable to invoke GetFileAttributes() function or FILE_ATTRIBUTE_HIDDEN property")
}
return false, nil
}
func main() {
if len(os.Args) != 2 {
fmt.Printf("Usage : %s <filename>\n", os.Args[0])
os.Exit(0)
}
filename := os.Args[1]
result, err := IsHidden(filename)
if err != nil {
log.Println(err)
}
log.Println(filename, "is hidden? ", result)
}
Sample output:
References:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364944(v=vs.85).aspx
See also : Golang : Test file read write permission example
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+8.6k Golang : Ackermann function example
+6.3k Golang : Debug with Godebug
+7.9k Golang : Scan files for certain pattern and rename part of the files
+10.7k Golang : Generate 403 Forbidden to protect a page or prevent indexing by search engine
+20.9k Golang : Read directory content with os.Open
+15.1k Golang : How to check for empty array string or string?
+5.6k Unix/Linux/MacOSx : How to remove an environment variable ?
+14.7k Golang : How to determine if user agent is a mobile device example
+9.4k Golang : Write multiple lines or divide string into multiple lines
+18.6k Golang : Example for RSA package functions
+22.6k Golang : Convert Unix timestamp to UTC timestamp
+11.4k Golang : How to pipe input data to executing child process?