【发布时间】:2013-04-25 22:30:22
【问题描述】:
在 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 获取它的值?
【问题讨论】:
-
你可以随时通过python执行系统命令并调用ATTRIB
-
我尝试将其作为一种解决方法,但必须检查每个文件使其非常慢。
-
通常情况下,事实上,您必须像这样将常量
FILE_ATTRIBUTE_SYSTEM粘贴到您的代码中。在 Windows 上,DLL 几乎从不导出常量符号,只导出函数。 (在 POSIX 上,共享对象经常做导出符号,但您想要的大多数值都是#define宏而不是符号……) -
附带说明,而不是
if not wfad.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM: return False else: return True,为什么不只是return wfad.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM? (如果您需要实际的True/False,只需在其上添加!= 0或bool(…)……但实际上,您的代码不应该关心它是得到True还是4,因为它们是两者都同样真实。) -
最后一条评论:在任何
ctypes函数上设置argtypes和restypes通常是个好主意。这样,如果可能,Python 可以自动转换您的参数,并在它们没有意义时引发异常。这样,你必须手动转换你的参数,如果你做错了,你会得到一个难以理解的异常(如果你幸运并且在 Windows 上)或崩溃(如果你不走运,或者不是在 Windows 上)。
标签: python windows file system stat