我试图让Python的备份程序中使用NTFS对象ID。 我在我的头上,但设法创build一个函数返回…的东西。
import sys import win32file import winioctlcon def object_id(filename): """ NTFS OBJECT_ID """ fhandle = win32file.CreateFileW( # FileName filename, # DesiredAccess win32file.GENERIC_READ, # ShareMode win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE, # SecurityAttributes None, # CreationDisposition win32file.OPEN_EXISTING, # FlagsAndAttributes 0 ) obj_id = win32file.DeviceIoControl( # Device : PyHANDLE # Handle to a file, device, or volume fhandle, # IoControlCode : int # IOControl Code to use, from winioctlcon winioctlcon.FSCTL_CREATE_OR_GET_OBJECT_ID, # InBuffer : str/buffer # The input data for the operation, can be None for some operations. None, # OutBuffer : int/buffer # Size of the buffer to allocate for output, or a writeable buffer as # returned by win32file::AllocateReadBuffer. 64, # Overlapped=None : PyOVERLAPPED An overlapped object for async # operations. Device handle must have been opened with # FILE_FLAG_OVERLAPPED. None ) fhandle.Close() return obj_id
调用此函数的一些示例输出是一个类似于“↑∟k◄◄êê%d d d d d M / / /╧╧╧╧d d d str str str str str str str str str str”。 这对我的程序来说是很好的,只要它对我备份的每个文件都是一致的。 但是我在这里做了什么可怕的错误? 理想情况下,我想尽可能正确地实现这一点。
是。 这是100%有效。
你是返回三个OBJECT_ID :
对象ID:3FB73FE2-6BF2-3F3F-EA3F-2025643F3F3F
出生体积编号:684DEA63-A6C6-2D4A-BF2F-2D79A62BF470
出生对象ID:3FB73FE2-6BF2-3F3F-EA3F-2025643F3F3F
这个输出如预期的那样。 🙂
从我的问题输出str使用binascii.hexify()产量:“18fa1c836b95e31188eb002564e9e3cf684d8863dd92cf4aa82fcf79ccd993e318fa1c836b95e31188eb002564e9e3cf00000000000000000000000000000000”。 这与以下结果相同:
C:\Windows\system32>fsutil.exe objectid query "myfile.txt" Object ID : 18fa1c836b95e31188eb002564e9e3cf BirthVolume ID : 684d8863dd92cf4aa82fcf79ccd993e3 BirthObjectId ID : 18fa1c836b95e31188eb002564e9e3cf Domain ID : 00000000000000000000000000000000
所以我有从fsutil.exe独立的验证,我的Python功能正在产生正确的输出。
我仍然不知道Windows的功能是否被完全正确地使用,如果不是,那么将会很感激。