Get file creation time with Python on Mac

前端 未结 3 1583
囚心锁ツ
囚心锁ツ 2020-12-19 01:57

Python\'s os.path.getctime on the Mac (and under Unix in general) does not give the date when a file was created but \"the time of the last change\" (according to the docs a

相关标签:
3条回答
  • 2020-12-19 02:04

    By lack of a good utility, I've created crtime.

    pip install crtime
    

    Then you can use it like:

    sudo crtime ./
    

    Would print:

    1552938281  /home/pascal/crtime/.gitignore
    1552938281  /home/pascal/crtime/README.md
    1552938281  /home/pascal/crtime/crtime
    1552938281  /home/pascal/crtime/deploy.py
    1552938281  /home/pascal/crtime/setup.cfg
    1552938281  /home/pascal/crtime/setup.py
    1552938961  /home/pascal/crtime/crtime.egg-info
    1552939447  /home/pascal/crtime/.git
    1552939540  /home/pascal/crtime/build
    1552939540  /home/pascal/crtime/dist
    

    Note that for large directories it will be easily 1000x faster than xstat that is sometimes mentioned, as this creates a temporary file and then executes stat calls for all files at once.

    0 讨论(0)
  • 2020-12-19 02:20

    ctime differs on the platform: On some systems (like Unix) is the time of the last metadata change, and, on others (like Windows), is the creation time. That's because Unices usually don't preserve the "original" creation time.

    That said you can access all information that the OS provides with the stat module.

    The stat module defines constants and functions for interpreting the results of os.stat(), os.fstat() and os.lstat() (if they exist). For complete details about the stat, fstat and lstat calls, consult the documentation for your system.

    stat.ST_CTIME
    The “ctime” as reported by the operating system. On some systems (like Unix) is the time of the last metadata change, and, on others (like Windows), is the creation time (see platform documentation for details).

    0 讨论(0)
  • 2020-12-19 02:24

    Use the st_birthtime property on the result of a call to os.stat() (or fstat/lstat).

    def get_creation_time(path):
        return os.stat(path).st_birthtime
    

    You can convert the integer result to a datetime object using datetime.datetime.fromtimestamp().

    For some reason I don't think this worked on Mac OS X when this answer was first written, but I could be mistaken, and it does work now, even with older versions of Python. The old answer is below for posterity.


    Using ctypes to access the system call stat64 (works with Python 2.5+):

    from ctypes import *
    
    class struct_timespec(Structure):
        _fields_ = [('tv_sec', c_long), ('tv_nsec', c_long)]
    
    class struct_stat64(Structure):
        _fields_ = [
            ('st_dev', c_int32),
            ('st_mode', c_uint16),
            ('st_nlink', c_uint16),
            ('st_ino', c_uint64),
            ('st_uid', c_uint32),
            ('st_gid', c_uint32), 
            ('st_rdev', c_int32),
            ('st_atimespec', struct_timespec),
            ('st_mtimespec', struct_timespec),
            ('st_ctimespec', struct_timespec),
            ('st_birthtimespec', struct_timespec),
            ('dont_care', c_uint64 * 8)
        ]
    
    libc = CDLL('libc.dylib') # or /usr/lib/libc.dylib
    stat64 = libc.stat64
    stat64.argtypes = [c_char_p, POINTER(struct_stat64)]
    
    def get_creation_time(path):
        buf = struct_stat64()
        rv = stat64(path, pointer(buf))
        if rv != 0:
            raise OSError("Couldn't stat file %r" % path)
        return buf.st_birthtimespec.tv_sec
    

    Using subprocess to call the stat utility:

    import subprocess
    
    def get_creation_time(path):
        p = subprocess.Popen(['stat', '-f%B', path],
            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        if p.wait():
            raise OSError(p.stderr.read().rstrip())
        else:
            return int(p.stdout.read())
    
    0 讨论(0)
提交回复
热议问题