Проверка атрибутов файла в python - PullRequest
2 голосов
/ 18 марта 2009

Я бы хотел проверить бит архива для каждого файла в каталоге, используя python. Пока у меня есть следующее, но я не могу заставить его работать должным образом. Идея сценария состоит в том, чтобы иметь возможность видеть все файлы, на которых установлен бит архива.

Спасибо

# -*- coding: latin-1 -*-
import os , win32file, win32con
from time import *
start = clock()

ext = [ '.txt' , '.doc' ]

def fileattributeisset(filename, fileattr):
    return bool(win32file.GetFileAttributes(filename) & fileattr)

for root, dirs, files in os.walk('d:\\Pruebas'):
    print ("root", root)    
    print ("dirs", dirs)
    print ("files", files)
    for i in files:
        if i[ - 4:] in ext: 
            print('...', root, '\\', i, end=' ')
            fattrs = win32file.GetFileAttributes(i)
            if fattrs & win32con.FILE_ATTRIBUTE_ARCHIVE:
                print('A isSet',fattrs)
        #print( fileattributeisset(i, win32con.FILE_ATTRIBUTE_ARCHIVE)) 
    print ('####')

РЕДАКТИРОВАТЬ: все файлы, по-видимому, имеют бит архива, выполнение команды attrib показывает, что все файлы не имеют битов атрибута.

1 Ответ

6 голосов
/ 19 марта 2009

Список файлов, возвращаемый из os.walk, не является полностью определенным путем, поэтому при вызове

win32file.GetFileAttributes(i)

не может найти файл и возвращает код ошибки; что бывает -1. Итак, операция

fattrs & win32con.FILE_ATTRIBUTE_ARCHIVE 

всегда верно.

Вам необходимо присоединить корень к имени файла, чтобы GetFileAttributes был успешным:

fattrs = win32file.GetFileAttributes(os.path.join(root, i))

Кроме того, когда вы проверяете расширение, вероятно, лучше использовать os.path.splitext(path) для получения расширения, а не полагаться на них длиной в 3 символа, как вы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...