-1

Python で、「ウィンドウ システム ファイル」であるファイルを特定するにはどうすればよいですか。コマンドラインから、次のコマンドでこれを行うことができます:

ATTRIB "c:\file_path_name.txt"

戻り値に「S」文字が含まれている場合、それは Windows システム ファイルです。Pythonで同等のものを理解できません。同様のクエリのいくつかの例は次のようになります。

ファイルは書き込み可能ですか?

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 を使用してその値を取得することはできますか?

4

1 に答える 1