В python, как я могу определить файл, который является «системным файлом окна». Из командной строки я могу сделать это с помощью следующей команды:
ATTRIB "c:\file_path_name.txt"
Если в возврате есть символ «S», то это системный файл Windows. Я не могу понять эквивалент в питоне. Несколько примеров подобных запросов выглядят следующим образом:
Является ли файл доступным для записи?
import os
filePath = r'c:\testfile.txt'
if os.access(filePath, os.W_OK):
print 'writable'
else:
print 'not writable'
другой путь...
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'
Но я не могу найти функцию или перечисление для идентификации системного файла Windows. Надеюсь, есть встроенный способ сделать это. Я бы предпочел не использовать win32com или другой внешний модуль.
Причина, по которой я хочу это сделать, заключается в том, что я использую os.walk для копирования файлов с одного диска на другой. Если бы был способ обойти дерево каталогов, игнорируя системные файлы, это тоже могло бы сработать.
Спасибо за чтение.
Вот решения, которые я придумал на основе ответа:
Использование 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'
и используя 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'
Интересно, допустима ли вставка константы «FILE_ATTRIBUTE_SYSTEM» в мой код, или я могу также получить ее значение с помощью ctypes?
FILE_ATTRIBUTE_SYSTEM
в свой код таким образом. В Windows библиотеки DLL почти никогда не экспортируют константные символы, а только функции. (В POSIX общие объекты часто экспортируют символы, но большинство значений, которые вам нужны, в любом случае оказываются#define
макросами, а не символами…) - person abarnert   schedule 02.05.2013if not wfad.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM: return False else: return True
, почему бы не простоreturn wfad.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM
? (Если вам нужны фактическиеTrue
/False
, просто добавьте к ним!= 0
илиbool(…)
… но на самом деле вашему коду не должно быть важно, получит ли онTrue
или4
, так как они оба одинаково правдивы.) - person abarnert   schedule 02.05.2013argtypes
иrestypes
для любыхctypes
функций. Таким образом, Python может автоматически преобразовывать ваши аргументы, если это возможно, и вызывать исключение, если они не имеют смысла. Таким образом, вам придется вручную преобразовывать ваши аргументы, и если вы сделаете это неправильно, вы получите труднопонятное исключение (если вам повезет и вы работаете в Windows) или сбой (если вам не повезет или нет). в Windows). - person abarnert   schedule 02.05.2013