Python: Windows Systemdatei

In python, wie kann ich eine datei identifizieren, die eine "fenster systemdatei" ist. Von der Kommandozeile aus kann ich dies mit folgendem Befehl machen:

ATTRIB "c:\file_path_name.txt" 

Wenn die Rückkehr das "S" -Zeichen hat, dann ist es eine Windows-Systemdatei. Ich kann den Gleichgewicht in Python nicht herausfinden. Ein paar Beispiele für ähnliche Abfragen sehen so aus:

  • Python-Daemon, um einen Ordner zu sehen und eine Datenbank zu aktualisieren
  • Python: Die Dateimanagement mal mit größerer Auflösung als eine Sekunde
  • Dateien in einem Ordner als Stream auflisten, um den Prozess sofort zu starten
  • Ist eine Datei beschreibbar?

     import os filePath = r'c:\testfile.txt' if os.access(filePath, os.W_OK): print 'writable' else: print 'not writable' 

    ein anderer Weg…

     import os import stat filePath = r'c:\testfile.txt' attr = os.stat(filePath)[0] if not attr & stat.S_IWRITE: print 'not writable' else: print 'writable' 

    Aber ich kann keine Funktion oder enum finden, um eine Windows-Systemdatei zu identifizieren. Hoffentlich gibt es einen eingebauten Weg, dies zu tun. Ich würde lieber nicht mit win32com oder einem anderen externen Modul arbeiten müssen.

    Der Grund, warum ich das tun möchte, ist, weil ich oswalk verwende, um Dateien von einem Laufwerk zum anderen zu kopieren. Wenn es einen Weg gab, um den Verzeichnisbaum zu gehen, während ich Systemdateien ignoriere, die auch funktionieren können.

    Danke fürs Lesen.

    Hier sind die Lösungen, die ich auf der Grundlage der Antwort gefunden habe:

    Mit win32api:

     import win32api import win32con filePath = r'c:\test_file_path.txt' if not win32api.GetFileAttributes(filePath) & win32con.FILE_ATTRIBUTE_SYSTEM: print filePath, 'is not a windows system file' else: print filePath, 'is a windows system file' 

    Und mit ctypes:

     import ctypes import ctypes.wintypes as types # From pywin32 FILE_ATTRIBUTE_SYSTEM = 0x4 kernel32dll = ctypes.windll.kernel32 class WIN32_FILE_ATTRIBUTE_DATA(ctypes.Structure): _fields_ = [("dwFileAttributes", types.DWORD), ("ftCreationTime", types.FILETIME), ("ftLastAccessTime", types.FILETIME), ("ftLastWriteTime", types.FILETIME), ("nFileSizeHigh", types.DWORD), ("nFileSizeLow", types.DWORD)] def isWindowsSystemFile(pFilepath): GetFileExInfoStandard = 0 GetFileAttributesEx = kernel32dll.GetFileAttributesExA GetFileAttributesEx.restype = ctypes.c_int # I can't figure out the correct args here #GetFileAttributesEx.argtypes = [ctypes.c_char, ctypes.c_int, WIN32_FILE_ATTRIBUTE_DATA] wfad = WIN32_FILE_ATTRIBUTE_DATA() GetFileAttributesEx(pFilepath, GetFileExInfoStandard, ctypes.byref(wfad)) return wfad.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM filePath = r'c:\test_file_path.txt' if not isWindowsSystemFile(filePath): print filePath, 'is not a windows system file' else: print filePath, 'is a windows system file' 

    Ich frage mich, ob das Einfügen der Konstante "FILE_ATTRIBUTE_SYSTEM" in meinem Code ist legit, oder kann ich seinen Wert mit Ctypes auch bekommen?

  • Warum benutzt python zwei Unterstriche für bestimmte Dinge?
  • Was ist die Bedeutung eines Einzel- und eines Doppel-Unterstriches vor einem Objektnamen?
  • Warum haben einige Funktionen "__" vor und nach dem Funktionsnamen unterstrichen?
  • One Solution collect form web for “Python: Windows Systemdatei”

    Aber ich kann keine Funktion oder enum finden, um eine Windows-Systemdatei zu identifizieren. Hoffentlich gibt es einen eingebauten Weg, dies zu tun.

    Es gibt keine solche Sache. Python's Datei Abstraktion hat keine Ahnung von "System-Datei", so dass es nicht geben Sie keine Möglichkeit, es zu bekommen. Auch Pythons stat ist ein sehr dünner Wrapper um die _stat oder _stat Funktionen in der C-Laufzeitbibliothek von Microsoft, die keine Vorstellung von "Systemdatei" hat. Der Grund dafür ist, dass sowohl Python-Dateien und Microsofts C-Bibliothek sind beide entworfen, um "so ziemlich wie POSIX" zu sein.

    Natürlich hat Windows auch eine ganz andere Abstraktion für Dateien. Aber diese ist nicht durch die open , stat , etc. Funktionen ausgesetzt; Vielmehr gibt es eine völlig parallele Reihe von Funktionen wie CreateFile , GetFileAttributes , etc. Und du musst diese anrufen, wenn du diese Informationen wünschst.

    Ich würde lieber nicht mit win32com oder einem anderen externen Modul arbeiten müssen.

    Nun, du brauchst keine win32com , denn das ist nur Windows API, nicht COM.

    Aber win32api ist der einfachste Weg, es zu tun. Es bietet eine schöne Wrapper um GetFileAttributesEx , die die Funktion, die Sie anrufen möchten.

    Wenn du kein externes Modul verwenden möchtest, kannst du immer Windows-API-Funktionen über ctypes . Oder verwenden Sie subprocess , um Befehlszeilentools auszuführen (wie ATTRIB – oder wenn Sie es vorziehen, wie DIR /S /AS , damit Windows die rekursiven Walk-Skipping-System-Dateien für Sie ATTRIB …).

    Die ctypes docs zeigen, wie man Windows-API-Funktionen ctypes , aber es ist ein wenig schwierig das erste Mal.

    Zuerst musst du auf die MSDN-Seite gehen, um herauszufinden, was DLL Sie benötigen (kernel32), und ob Ihre Funktion getrennte A- und W-Varianten hat (was tut) und welche Werte für irgendwelche Konstanten passieren müssen (Sie müssen folgen Eine Verknüpfung zu einer anderen Seite und wissen, wie C enums funktioniert, um herauszufinden, dass GetFileExInfoStandard 0 ist), und dann musst du herausfinden, wie man irgendwelche struct notwendig definiert. In diesem Fall so etwas wie dieses:

     from ctypes import * kernel = windll.kernel32 GetFileExInfoStandard = 0 GetFileAttributesEx = kernel.GetFileAttributesEx GetFileAttributesEx.restype = c_int GetFileAttributesEx.argypes = # ... 

    Wenn Sie wirklich wollen, mit win32api zu vermeiden, können Sie die Arbeit, um die ctypes Wrapper selbst beenden. Persönlich würde ich win32api benutzen.


    Inzwischen:

    Der Grund, warum ich das tun möchte, ist, weil ich oswalk verwende, um Dateien von einem Laufwerk zum anderen zu kopieren. Wenn es einen Weg gab, um den Verzeichnisbaum zu gehen, während ich Systemdateien ignoriere, die auch funktionieren können.

    Für diesen Fall, besonders angesichts Ihrer Beschwerde, dass die Überprüfung jeder Datei zu langsam war, möchten Sie wahrscheinlich auch nicht os.walk . Verwenden FindFirstFileEx stattdessen FindFirstFileEx und führen Sie die Rekursion manuell durch. Sie können Dateien und Verzeichnisse unterscheiden, ohne dass Sie (oder GetFileAttributesEx ) jede Datei (die os.walk unter den Deckeln) ausführt, können Sie Systemdateien direkt innerhalb der os.walk herausfiltern, anstatt jede Datei zu stat , etc.

    Wieder sind die Optionen die gleichen: Verwenden Sie win32api wenn Sie es einfach sein wollen, verwenden Sie ctypes sonst.

    Aber in diesem Fall würde ich einen Blick auf Ben Hoyts betterwalk , weil er bereits 99% der ctypes Umwicklung und 95% des Restes des Codes gemacht hat, die du willst.

    Python ist die beste Programmiersprache der Welt.