Datum bei Kopieren einer Datei beibehalten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Guten Abend zusammen,

mit 'shutil.copy2' kopiere ich Dateien von der Festplatte des Computers auf eine USB-Platte. Die Funktion ist vorhanden, allerdings wird in den Eigenschaften der kopierten Datei als Erstelldatum das aktuelle Kopierdatum und nicht das ursprüngliche Erstelldatum der Datei angezeigt (so wie auf der Festplatte des Computers vermerkt ist). Ich verwende Windows 10 2004 und Python 3.5.1. Mit diesem Skript sollen Daten gesichert werden. Kann mir jemand sagen, woran das liegt und welche Auswirkungen das ggf. hat? Gibt es vielleicht eine andere Möglichkeit die Dateien so zu kopieren, dass auch das Erstelldatum und nicht nur das Geändertdatum gleich bleiben?

Vielen Dank und einen schönen Feiertag.
snowflake
Benutzeravatar
noisefloor
User
Beiträge: 3882
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

AFAIK geht das nicht, also unter Win zumindest. Lt. roter Hinweisbox in der Python Doku geht unter Win auch der Besitzer der Datei verloren. Was für eine Datensicherung u.U. auch suboptimal ist. Da brauchst du wohl ein anderes Programm.

BTW: Python 3.5 ist seit September 2020 EOL. Du solltest auf ein neueres Python wechseln.

Gruß, noisefloor
Benutzeravatar
sparrow
User
Beiträge: 4237
Registriert: Freitag 17. April 2009, 10:28

Woran das liegt: Das ist ein Windows-Ding. Beim Kopieren wird die Creation-Time nicht mitkopiert. Also nie. Das liegt nicht an der Funktion in Python. Auch wenn du eine Datei im Explorer kopierst, wirst du das verhalten bemerken. Die Python-Dokumentaion zählt daher auch wie folgt auf: "Copy the permission bits, last access time, last modification time, and flags from src to dst." Keine Creation-Time.
Und den Hinweis aus dem Beitrag von Noisefloor nicht vergessen.

Grundsätzlich kannst du das aber nachbilden. Möchtest du auch den Owner der Datei behalten?
Benutzeravatar
sparrow
User
Beiträge: 4237
Registriert: Freitag 17. April 2009, 10:28

Code: Alles auswählen

import shutil
import os.path

from ctypes import windll, wintypes, byref


def win_copy2(src, dst, follow_symlinks=True):
    """ Uses shutil.copy2 but also set the creation time for
    dst to the creation time of src.

    Source: https://stackoverflow.com/questions/4996405/
    """
    
    dst = shutil.copy2(src, dst, follow_symlinks=follow_symlinks)
    creation_unix = os.path.getctime(src)
    timestamp_base = int((creation_unix * 10000000) + 116444736000000000)
    creation_windows = wintypes.FILETIME(timestamp_base & 0xFFFFFFFF,
                                         +timestamp_base >> 32)
    file_handle = windll.kernel32.CreateFileW(dst, 256, 0, None, 3, 128, None)
    windll.kernel32.SetFileTime(file_handle, byref(creation_windows), None, None)
    windll.kernel32.CloseHandle(file_handle)
    return dst
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Guten Morgen zusammen,

vielen Dank für die Rückmeldungen.

@noisefloor:
Grundsätzlich kannst du das aber nachbilden. Möchtest du auch den Owner der Datei behalten?
Was meinst Du damit? Der Eigentümer wäre mir nicht so wichtig.


Viele Grüße
snowflake
Benutzeravatar
sparrow
User
Beiträge: 4237
Registriert: Freitag 17. April 2009, 10:28

@Snowflake: Wenn du shutil.copy2 verwenden möchtest aber das Erstellungsdatum erhalten bleiben soll, dann nimm den Code aus meinem vorherigen Post.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Hallo sparrow,

das habe ich soeben getan und es funktioniert super. Vielen herzlichen Dank dafür und auch ein herzliches Dankeschön an die anderen.

Viele Grüße und bleibt alle gesund
snowflake
Benutzeravatar
noisefloor
User
Beiträge: 3882
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Was meinst Du damit? Der Eigentümer wäre mir nicht so wichtig.
Dateien haben einen Besitzer. Unter Linux sind daran auch Rechte gekoppelt. Bei Windows weiß ich das nicht genau, was da alles dran hängt, dazu benutze ich Windows zu wenig.

Wenn du eine Sicherung machst, dann aber alle Dateien dem Nutzer gehören, der die Sicherung gemacht hat, könnte es nach dem Rückspielen einer Sicherung halt passieren, dass der ursprüngliche Besitzer die Datei z.B. nicht mehr Editieren / Speichern kann. Was ungünstig wäre.

Gruß, noisefloor
Antworten