:Pythonとctypesを使用してWindows上でファイルの属性を読み書きする方法はありますか?レコードの場合
a
手段 'アーカイブ's
手段 'システム' '読み取り専用'h
手段 '隠された'r
手段 '刃先交換式'i
手段
私のcurre Pythonスクリプトからこれらの属性を読み書きするには、subprocessモジュールを使用してattrib
を呼び出します。
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}
しかし、ディレクトリは、多くのエントリ(エントリごとに1つのサブプロセスの呼び出しが)含まれている場合、これが遅い実行します。
第三者のモジュールの依存関係が必要ないので、私は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)の完全な一覧を示します。属性をチェックするには、ビット単位のAND(演算子 '&')を使用します。例: 'readonly = attrs&FILE_ATTRIBUTE_READONLY'です。属性を追加するには、ビット単位のOR(すなわち、演算子 '|')を使用します。例: '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モジュール](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。カーネル32.SetFileAttributesW(u "path \\ to \\ file"、attrs):raise ctypes.WinError(ctypes.get_last_error()) '。WinDLL( 'kernel32'、use_last_error = True); Python 2を使用している場合は、パスがUnicode文字列であることを確認してください。 – eryksun