Chciałbym dotknąć moje pliki z kodu C, aby zmienić ich datę dostępu. To nie działa:Jak programowo wpisywać daty modyfikacji plików w POSIX?
struct stat fileSt;
lstat(path, &fileSt);
fileSt.st_mtime = time(NULL);
Dziękuję za pomoc.
Chciałbym dotknąć moje pliki z kodu C, aby zmienić ich datę dostępu. To nie działa:Jak programowo wpisywać daty modyfikacji plików w POSIX?
struct stat fileSt;
lstat(path, &fileSt);
fileSt.st_mtime = time(NULL);
Dziękuję za pomoc.
Myślę, że chcesz utime(2)
. To powinno wystarczyć:
utime(filename, NULL);
Docs powiedzieć:
int utime(const char *filename, const struct utimbuf *times);
[...]
utime() wywołanie systemowe zmienia dostępu i modyfikacji czasy węzła określony przez nazwę pliku do pól czasu działania i modtime odpowiednio .
Jeśli czas wynosi
NULL
, czas dostępu i modyfikacji pliku to ustawiony na bieżący czas.
Myślę, że trzeba spojrzeć na wywołanie systemowe utime()/utimes(). Nie przy moim normalnym komputerze, więc nie mogę poszukać szczegółów, których się boję.
utimes() to prawdopodobnie jak to zrobić. utime() jest przestarzały.
Takie rzeczy są trywialne, aby określić za pomocą narzędzi takich jak strace.
strace touch -t 01010911 xxx
.
.
open("xxx", O_WRONLY|O_NONBLOCK|O_CREAT|O_NOCTTY|O_LARGEFILE, 0666) = 0
utimes("/proc/self/fd/0", {1230829860, 0}) = 0
Stary utime()
i utimes()
są OK dla wielu przypadków użycia, ale zaktualizować atime
& mtime
z rozdzielczością nanosekundy, które trzeba na nowoczesnych systemach, przeznaczenie:
utimensat(0, path, NULL, 0);
Jest bardzo przydatne w połączeniu z nowszym stat()
, który zwraca również pole struct timespec
st_mtim
w struct stat
z rozdzielczością nanosekundową.
Ta odpowiedź jest prawie poprawna, ale zamiast 0 jako pierwszego argumentu należy użyć AT_FDCWD. Trzecim argumentem jest tablica 2 struktur czasowych. – Sven
Oczywiście zawsze dobrze jest przeczytać instrukcję do polecenia, którego nigdy wcześniej nie używałeś zamiast wycinania i wklejania. Pierwszym argumentem powinno być 'AT_FDCWD', jeśli ścieżka jest względna, a trzeci argument może mieć wartość' NULL', przynajmniej w systemach GLIBC, a następnie będzie domyślny na bieżący czas, np. 'Touch (1)' – troglobit
Wierzę, że strace jest specyficzne dla systemu Linux, a OP nie wspomniał o tym, którego systemu UNIX używał (Solaris, FreeBSD itp. Mają podobne polecenia, ale nie straceją). – bortzmeyer
Dziwne, POSIX oznacza utime() jako dziedzictwo, mimo że zapewnia więcej funkcji niż utime() – Chris
@Chris już nie. Zgodnie z wydaniem 7 "Oznaczenie LEGACY jest usunięte.". Źródło: http://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html – Alexandros