Для записей:Как читать или записывать атрибуты файла s h i i в Windows с использованием Python и ctypes?
a
означает 'хранения с's
означает 'система'h
означает 'скрытый'r
означает 'только для чтения'i
означает 'индексируемой'
My curre nt для чтения/записи этих атрибутов из сценариев Python является вызов attrib
с использованием модуля subprocess.
код Python:
import os, subprocess
def attrib(path, a=None, s=None, h=None, r=None, i=None):
attrs=[]
if r==True: attrs.append('+R')
elif r==False: attrs.append('-R')
if a==True: attrs.append('+A')
elif a==False: attrs.append('-A')
if s==True: attrs.append('+S')
elif s==False: attrs.append('-S')
if h==True: attrs.append('+H')
elif h==False: attrs.append('-H')
if i==True: attrs.append('+I')
elif i==False: attrs.append('-I')
if attrs: # write attributes
cmd = attrs
cmd.insert(0,'attrib')
cmd.append(path)
cmd.append('/L')
return subprocess.call(cmd, shell=False)
else: # just read attributes
output = subprocess.check_output(
['attrib', path, '/L'],
shell=False, universal_newlines=True
)[:9]
attrs = {'A':False, 'S':False, 'H':False, 'R':False, 'I':False}
for char in output:
if char in attrs:
attrs[char] = True
return attrs
path = 'C:\\test\\'
for thing in os.listdir(path):
print(thing, str(attrib(os.path.join(path,thing))))
Выход:
archivable.txt {'A': True, 'I': False, 'S': False, 'H': False, 'R': False}
hidden.txt {'A': True, 'I': False, 'S': False, 'H': True, 'R': False}
normal.txt {'A': True, 'I': False, 'S': False, 'H': False, 'R': False}
readonly.txt {'A': True, 'I': False, 'S': False, 'H': False, 'R': True}
system.txt {'A': True, 'I': False, 'S': True, 'H': False, 'R': False}
Но это работает медленно, когда каталог содержит много записей (один подпроцесс вызова для каждой записи).
Я не хочу использовать модуль win32api, потому что мне не нужны зависимости стороннего модуля. Также им любопытно, как это сделать с ctypes.
Я наткнулся на Hide Folders/ File with Python [closed], Set "hide" attribute on folders in windows OS? и Python: Windows System File, но это мне непонятно. Особенно я не понимаю, что такое 0x4 es 0x02 es. Вы можете это объяснить? Можете ли вы привести конкретный пример кода?
атрибуты файла сохраняются в виде битовой карты в 32-битного числа, при этом каждый бит соответствует атрибуту. Бит 0 равен '2 ** 0 == 1'. Бит 1 - '2 ** 1 == 2' и т. Д. Ниже приведен полный список [константы атрибутов файла] (https://msdn.microsoft.com/en-us/library/gg258117). Для проверки атрибута используйте побитовое И (т. Е. Оператор '&'). Например: 'readonly = attrs & FILE_ATTRIBUTE_READONLY'. Чтобы добавить атрибут, используйте побитовое ИЛИ (то есть оператор '|'). Например: 'attrs | = FILE_ATTRIBUTE_READONLY'. – eryksun
Для чтения Python 3.5+ 'stat' имеет [' st_file_attributes'] (https://docs.python.org/3/library/os.html#os.stat_result.st_file_attributes), а константы атрибутов определены в [stat module] (https://docs.python.org/3/library/stat.html#stat.FILE_ATTRIBUTE_ARCHIVE). Самый быстрый способ ставить все файлы в каталоге в 3.5 - использовать ['os.scandir'] (https://docs.python.org/3/library/os.html#os.scandir). – eryksun
Для записи атрибутов файлов вам нужно будет использовать ctypes для вызова ['SetFileAttributesW'] (https://msdn.microsoft.com/en-us/library/aa365535). Например: 'kernel32 = ctypes.WinDLL ('kernel32', use_last_error = True), '' if not kernel32.SetFileAttributesW (u "путь \\ to \\ file", attrs): raise ctypes.WinError (ctypes.get_last_error()) '. Убедитесь, что путь является строкой Unicode, если вы используете Python 2. – eryksun