Search code examples
pythonsftpparamiko

Get file's creation timestamp using Paramiko SFTP


Any idea if there is actually a way to get "ctime", a file's created timestamp from a SFTP server? Using Paramiko for SFTP, I am only seeing "atime" and "mtime". However, I am trying to access the file's original created timestamp (and not the "atime").

Here is the current code I built, but commented out the part about file's created timestamp because it is causing errors:

for file in tqdm(sftp.listdir()):
    # Debug check:
    print('We are now in the try loop:')
    
    # Look for files that have the same starting 25 characters as the column
    # in the mapper file:
    mask = mapper.file_name_startswith.str[:25].str.contains(file[:25])
    
    # Grab the destination path info from the mapper file:
    dest_path = mapper[mask]['destination_path'].values[0]

    # Get the timestamp of the original file before we remove it, for both modified & created:
    remote_mod_time = sftp.stat(file).st_mtime 
    # Need to use a different method to get the created date:
    '''
    remote_file_attrs = sftp.listdir_attr('.')  
    for attr in remote_file_attrs:  
        if attr.filename == file:  
            remote_create_time = attr.st_ctime  
            break  
    '''       
    # Move the current file to our desired local (destination) path:
    local_path = os.path.join(dest_path, file)
    sftp.get(file, local_path)

    # Set the modified date timestamp of the downloaded file to match the timestamp of the original     file:  
    os.utime(local_path, (remote_mod_time, remote_mod_time)) 

    # Set the created date (cannot use os.utime for this) to match the timestamp of the original file:
    #date_time = pywintypes.Time(remote_create_time)  
    #win32file.SetFileTime(local_path, date_time, None, None)  
    
    # Remove the current file, which is being processed, from the sftp server:
    #sftp.remove(file)
    
    # Append the file to the "done_file" list:
    done_files.append(file)

Solution

  • The file creation time is supported since SFTP version 4 only. Most SFTP servers (notably OpenSSH) support SFTP version 3 only. Same for Paramiko (on the client-side).

    So in most cases (even if you patch Paramiko to support SFTP 4), you won't be able to retrieve the creation time from your SFTP server.


    If you have a shell access to the server, you might be able to retrieve the creation time using shell commands. But that's not an SFTP question anymore.