我需要locking一个文件的排他性,并不断保持写在Windows 7上的内容。目标:当文件正在写排他锁有一个SFTP计划,从不同的服务器拉这个文件。 我们需要validation文件是否被部分拉动,即使文件上有独占锁。 使用下面的批处理脚本,但我如何获得一个锁30秒到1分钟?
@echo off if '%1' == '-lock' ( shift goto :main ) call %0 -lock > SAMPLEFILE.csv goto :eof :main ping -n 30 127.0.0.1 > nul echo %DATE% %TIME% - start TREE C:\ echo %DATE% %TIME% - finish goto :eof
在主程序的生命周期中,SAMPLEFILE.csv上有一个独占的写锁。 主程序返回后锁定被释放。 您可以通过添加延迟返回的命令来延长锁的长度。 例如, timeout 60 /nobreak >nul
会延迟锁定释放1分钟。 但我不明白你有什么好处。
锁只能防止其他进程写入文件。 任何进程在锁定时仍然可以读取部分文件。 有可能检测一个文件是否被另一个进程锁定 ,但是我认为这对您的SFTP服务器没有帮助。
我认为防止部分下载文件最简单的方法是在SFTP帐户无法访问的文件夹中创建文件,但在同一个卷上。 文件完成后,可以通过MOVE命令立即将其移动到正确的位置。 在移动完成之前,文件对于SFTP是不可见的,所以不会有部分下载的风险。 请注意,如果在同一个卷内的两个文件夹之间移动,这只是瞬间的。
顺便说一句,你的脚本不需要用-lock
参数来调用自己。 您可以通过直接调用:main
来获得相同的效果。
@echo off call :main %* >SAMPLEFILE.csv exit /b :main ping -n 30 127.0.0.1 > nul echo %DATE% %TIME% - start TREE C:\ echo %DATE% %TIME% - finish exit /b
复制这个脚本
@echo off rundll32.exe user32.dll, LockWorkStation cls