Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python win32file.ReadDirectoryChangesW不';找不到所有移动的文件_Python_Python 2.7_Winapi_Pywin32 - Fatal编程技术网

Python win32file.ReadDirectoryChangesW不';找不到所有移动的文件

Python win32file.ReadDirectoryChangesW不';找不到所有移动的文件,python,python-2.7,winapi,pywin32,Python,Python 2.7,Winapi,Pywin32,早上好 我在用Python创建的程序中遇到了一个特殊的问题。看起来,当我将文件从一个位置拖放到另一个位置时,并非所有文件都被模块注册为事件 我一直在使用win32file和win32con尝试获取与将文件从一个位置移动到另一个位置进行处理相关的所有事件 这是我的检测代码的一小部分: import win32file import win32con def main(): path_to_watch = 'D:\\' _file_list_dir = 1 # Create

早上好

我在用Python创建的程序中遇到了一个特殊的问题。看起来,当我将文件从一个位置拖放到另一个位置时,并非所有文件都被模块注册为事件

我一直在使用win32file和win32con尝试获取与将文件从一个位置移动到另一个位置进行处理相关的所有事件

这是我的检测代码的一小部分:

import win32file
import win32con
def main():
    path_to_watch = 'D:\\'
    _file_list_dir = 1
    # Create a watcher handle
    _h_dir = win32file.CreateFile(
        path_to_watch,
        _file_list_dir,
        win32con.FILE_SHARE_READ |
        win32con.FILE_SHARE_WRITE |
        win32con.FILE_SHARE_DELETE,
        None,
        win32con.OPEN_EXISTING,
        win32con.FILE_FLAG_BACKUP_SEMANTICS,
        None
    )
    while 1:
        results = win32file.ReadDirectoryChangesW(
            _h_dir,
            1024,
            True,
            win32con.FILE_NOTIFY_CHANGE_FILE_NAME |
            win32con.FILE_NOTIFY_CHANGE_DIR_NAME |
            win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES |
            win32con.FILE_NOTIFY_CHANGE_SIZE |
            win32con.FILE_NOTIFY_CHANGE_LAST_WRITE |
            win32con.FILE_NOTIFY_CHANGE_SECURITY,
            None,
            None
        )
        for _action, _file in results:
            if _action == 1:
                print 'found!'
            if _action == 2:
                print 'deleted!'
我拖放了7个文件,结果只找到4个

# found!
# found!
# found!
# found!
如何检测所有丢弃的文件?

(这是我能找到的最好的文档)是一个包装器。下面是它的状态(关于缓冲区):

1.一般的 当您第一次调用ReadDirectoryChangesW时,系统会分配一个缓冲区来存储更改信息。此缓冲区与目录句柄关联,直到它关闭并且在其生存期内其大小不变。在调用此函数之间发生的目录更改将添加到缓冲区,然后在下次调用时返回。如果缓冲区溢出,则丢弃缓冲区的全部内容,lpBytesReturned参数包含零,并且ReadDirectoryChangesW函数失败,错误代码为error\u NOTIFY\u ENUM\u DIR

  • 我的理解是,这是一个不同于作为参数传递的缓冲区(lpBuffer):

    • 前者被传递给ReadDirectoryChangesW的每个调用(可以是为每个调用传递的不同缓冲区(大小不同)

    • 后者由系统分配,当前者在函数调用之前明确分配(由用户分配)
      时,前者是在函数调用之间存储数据(可能以某种原始格式)的,当函数被调用时,缓冲区内容被复制(并格式化)到lpBuffer(如果没有溢出)(同时被丢弃)

2.同步 同步成功完成后,lpBuffer参数是一个格式化的缓冲区,写入缓冲区的字节数在lpBytesReturned中可用。如果传输的字节数为零,则该缓冲区太大,系统无法分配,或者太小,无法提供有关发生的所有更改的详细信息n目录或子树。在这种情况下,您应该通过枚举目录或子树来计算更改

  • 这多少证实了我先前的假设

    • “缓冲区太大,系统无法分配”-可能在分配上一点的缓冲区时,会考虑nBufferLength
不管怎样,我把你的代码改了一点

代码00.py:

导入系统 导入msvcrt 导入pywintypes 导入Win32文件 导入win32con 导入win32api 导入win32event 文件列表目录=0x0001 添加的文件\u操作\u=0x00000001 文件\u操作\u已删除=0x00000002 异步_超时=5000 BUF_尺寸=65536 def get_dir_句柄(目录名称,异步): flags_和_attributes=win32con.FILE_FLAG_BACKUP_语义 如果是异步的: flags_和_属性|=win32con.FILE_FLAG_重叠 dir\u handle=win32file.CreateFile( 董事姓名, 文件列表目录, (win32con.FILE\u共享\u读取| win32con.FILE\u共享\u写入| win32con.FILE\u SHARE\u DELETE), 没有一个 win32con.OPEN_存在, 标记_和_属性, 没有一个 ) 返回方向手柄 def read_dir_更改(dir_句柄、大小或大小,重叠): 返回win32file.ReadDirectoryChangesW( 方向手柄, 大小, 是的, (win32con.FILE\u通知\u更改\u文件名| win32con.FILE\u通知\u更改\u目录\u名称| win32con.FILE\u通知\u更改\u属性| win32con.FILE\u通知\u更改\u大小| win32con.FILE\u通知\u更改\u上次写入| win32con.FILE\u NOTIFY\u CHANGE\u SECURITY), 重叠,, 没有一个 ) def句柄_结果(结果): 对于结果中的项目: 打印(“{}{:d}”。格式(项,len(项[1])) _动作,u=项 如果_action==文件_action _添加: 打印(“找到!”) 如果_action==文件_action _已删除: 打印(“已删除!”) def esc_按下() 返回msvcrt.kbhit()和ord(msvcrt.getch())==27 def监视器目录同步(目录句柄): idx=0 尽管如此: 打印(“索引:{:d}”。格式(idx)) idx+=1 结果=读取方向更改(方向句柄,大小,无) 处理结果(结果) 如果按esc_(): 打破 def监视器\u目录\u异步(目录句柄): idx=0 buffer=win32file.allocateradbuffer(BUF_大小) overlapped=pywintypes.overlapped() overlapped.hEvent=win32event.CreateEvent(无,假,0,无) 尽管如此: 打印(“索引:{:d}”。格式(idx)) idx+=1 读取目录更改(目录句柄、缓冲区、重叠) rc=win32event.WaitForSingleObject(overlapped.hEvent,异步超时) 如果rc==win32event.WAIT\u对象\u 0: bufer_size=win32file.GetOverlappedResult(dir_句柄,重叠,True) 结果=win32file.FILE\u通知信息(缓冲区、缓冲区大小) 处理结果(结果) elif rc==win32event.WAIT\u超时: #打印(“超时…”) 通过 其他: 打印(“已接收{:d}.Exiting.”格式(rc)) 打破 如果按esc_(): 打破 win32api.CloseHandle(重叠的.hEvent) def监视器目录(目录名称,asynch=False): dir\u handle=get\u dir\u handle(dir\u名称,异步) 如果是异步的: 监视器\u目录\u异步(目录句柄) 其他: 监视器目录同步(目录句柄) win32api.CloseHandle(目录句柄) def main(): 打印(“Python{:s}on{:s}\n.”格式(sys.version,sys.platform)) asynch=True 打印(“附件