Windowsでの「ファイル作成日時」を変更する方法


Windows上で、特定のファイルの作成日時を変更したいのですが、その方法が分かりません。

最終アクセス時刻と最終更新日時は `os.Chtimes()`
で変更できますが、作成日時を変更する方法はありますでしょうか。PowerShellを呼ぶしかないかなと考えています。




自己回答です（metropolisさんのコメントから）。

[このコード](https://github.com/golang/go/issues/21541#issuecomment-323837977)を元に、`Filetime`
の作成部分だけ書き直した例になります。

[code]

    package main
    
    import (
        "fmt"
        "os"
        "syscall"
        "time"
    )
    
    func main() {
    
        filename := os.Args[1]
    
        handle, err := syscall.CreateFile(
            syscall.StringToUTF16Ptr(filename),
            syscall.FILE_WRITE_ATTRIBUTES,
            syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
            nil,
            syscall.OPEN_EXISTING,
            syscall.FILE_ATTRIBUTE_NORMAL,
            0)
    
        if err != nil {
            fmt.Fprintf(os.Stderr, "Error opening %q: %v", filename, err)
            return
        }
    
        defer syscall.CloseHandle(handle)
    
        // 全てを現在時刻にする例
        t := time.Now().UnixNano()
    
        ctime := syscall.NsecToFiletime(t)
        atime := syscall.NsecToFiletime(t)
        mtime := syscall.NsecToFiletime(t)
    
        err = syscall.SetFileTime(handle, &ctime, &atime, &mtime)
    
        if err != nil {
            fmt.Fprintf(os.Stderr, "Error setting file %q time: %v", filename, err)
        }
    }
    
[/code]




自己回答です（metropolisさんのコメントから）。

[このコード](https://github.com/golang/go/issues/21541#issuecomment-323837977)を元に、`Filetime`
の作成部分だけ書き直した例になります。

[code]

    package main
    
    import (
        "fmt"
        "os"
        "syscall"
        "time"
    )
    
    func main() {
    
        filename := os.Args[1]
    
        handle, err := syscall.CreateFile(
            syscall.StringToUTF16Ptr(filename),
            syscall.FILE_WRITE_ATTRIBUTES,
            syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
            nil,
            syscall.OPEN_EXISTING,
            syscall.FILE_ATTRIBUTE_NORMAL,
            0)
    
        if err != nil {
            fmt.Fprintf(os.Stderr, "Error opening %q: %v", filename, err)
            return
        }
    
        defer syscall.CloseHandle(handle)
    
        // 全てを現在時刻にする例
        t := time.Now().UnixNano()
    
        ctime := syscall.NsecToFiletime(t)
        atime := syscall.NsecToFiletime(t)
        mtime := syscall.NsecToFiletime(t)
    
        err = syscall.SetFileTime(handle, &ctime, &atime, &mtime)
    
        if err != nil {
            fmt.Fprintf(os.Stderr, "Error setting file %q time: %v", filename, err)
        }
    }
    
[/code]

