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