我正在使用 python 来监视文件夹并检查文件是否正在被复制,如果是,则将它们复制到新位置。 我正在使用以下内容来监视文件夹: fsmonitor 我面临的问题是我无法辨别该文件是否正在使用中以及当前是否正在将内容写入磁盘。如果是这样,我想等到复制完成,然后开始将其复制到我的新位置。
那么如何确定文件是否正在使用/打开? 我在这里看到了一些建议,我尝试写入文件问题,如果失败,则表明该文件正在使用中: example answer (I've seen similar in python) 但是我不愿意使用这种方法,因为担心它可能会导致腐败等问题。 有没有替代/更安全的方法来做到这一点?或者测试写权限安全吗? 有人熟悉pywin32吗?它提供这样的工具吗?该网站看起来很神秘,所以想知道它是否有 windows 提供的最新 API,即使上面提到的 fsmointor 也使用相同的库,我想知道是否有更新/更有效的方法来做到这一点。
目前,我正在使用 psutil、proc.open_files() 循环遍历所有进程和所有文件以列出打开的文件。如果我担心的文件出现在此列表中,我会等待并重试。然而,这个过程创建了一个庞大的文件列表,并使用了我 12% 的 CPU 来创建它,所以我迫切需要一个替代方案。
回应阿德里安·麦卡锡 我一开始假设 fsmonitor 输出的任何内容都是安全的,但是如果您看到以下输出 which si 是单个文件副本:
0 86 0 创建 C:\Users\ScanUser\Pictures\syncTest dotnet-sdk-5.0.203-win-x64 - Copy.exe 3684bf38 创建 C:\Users\ScanUser\Pictures\syncTest dotnet-sdk-5.0.203-win-x64 - Copy.exe 3684bf38 0 86 0 修改 C:\Users\ScanUser\Pictures\syncTest dotnet-sdk-5.0.203-win-x64 - Copy.exe a8cf3250 修改 C:\Users\ScanUser\Pictures\syncTest dotnet-sdk-5.0.203-win-x64 - Copy.exe a8cf3250 0 160 0 修改 C:\Users\ScanUser\Pictures\syncTest dotnet-sdk-5.0.203-win-x64 - Copy.exe caef5c64 修改 C:\Users\ScanUser\Pictures\syncTest dotnet-sdk-5.0.203-win-x64.exe caef5c64 修改 C:\Users\ScanUser\Pictures\syncTest dotnet-sdk-5.0.203-win-x64 - Copy.exe caef5c64 修改 C:\Users\ScanUser\Pictures\syncTest dotnet-sdk-5.0.203-win-x64.exe caef5c64
所以难题是我应该从哪个“修改”开始复制文件?我可以等待几分钟/几秒钟,看看该文件是否出现了另一个“修改”,但是我如何决定通过 SFTP 等待大文件的时间可能需要 30 分钟,所以我需要一些可扩展的东西。 另外,我不希望对文件执行多次复制操作,因为这会使脚本效率低下。