Получить дату изменения папки в Go - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу получить дату, когда папка была переименована, из терминала это можно сделать с помощью команды stat, например:

> stat -x folders/folder1
File: "folders/folder1"
Size: 64           FileType: Directory
Mode: (0755/drwxr-xr-x)         Uid: (2006390509/username)  Gid: 
(296108113/EMEA\Domain Users)
Device: 1,4   Inode: 2599274    Links: 2
Access: Mon Nov 12 17:59:57 2018
Modify: Mon Nov 12 14:12:20 2018
Change: Mon Nov 12 17:28:01 2018 

Дата изменения - это последняя дата, когда метаданные папки былиИзменено, включая переименование.

Есть ли способ получить его с помощью Go, не используя os.exec и не анализируя вывод?os.Stat предоставляет только дату последнего изменения, которая не изменяется при переименовании папки.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Если вы довольны вызовом os.Exec, возможно, вы не возражаете против кроссплатформенных проблем.Некоторое время назад было некоторое обсуждение этого вопроса github .

Этот код работает для меня, чтобы все равно получить измененное время.Не уверен, как / если это будет работать в Windows:

file, err := os.Open("test")
if err != nil {
    panic(err)
}

stat, err := file.Stat()
sys := stat.Sys().(*syscall.Stat_t)
changedTime := time.Unix(sys.Ctim.Unix())

fmt.Println(stat.ModTime())
fmt.Println(changedTime)

Когда я запускаю

mv test test1 && mv test1 test && go run main.go

Это дает мне:

2018-11-12 17:31:38.659095951 +0000 GMT
2018-11-12 17:57:43.042208583 +0000 GMT

Что, кажется, правильноотражает время, когда я изменил имя, а не время создания (как в первой дате)

0 голосов
/ 12 ноября 2018

Время изменения недоступно в os.FileInfo, но его можно получить через os.FileInfo.Sys(), в котором хранятся эти данные.

Вы можете получить его по

package main

import (
    "fmt"
    "log"
    "os"
    "syscall"
    "time"
)

func main() {
    f, err := os.Stat("your/dir")
    if err != nil {
        log.Fatalf("err reading: %v", err)
    }

    //access change time saved in os.FileInfo.Sys()
    changeTime := f.Sys().(*syscall.Stat_t).Ctim

    fmt.Print(time.Unix(changeTime.Unix()).String())
}

Конечно, вам нужно проверитьесли f.Sys() это правильный тип, но да syscall.Stat_t.Ctim, вероятно, то, что вы хотели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...