windows - 如何使用 Windows 批处理脚本将文件独占锁定 1 分钟?

标签 windows batch-file locking

我需要独占锁定一个文件并在 Windows 7 上不断地向它写入内容。 目标:当使用独占锁写入文件时,有一个 SFTP 计划从不同的服务器拉取该文件。即使文件上有排他锁,我们也需要验证文件是否被部分拉取。 使用了下面的批处理脚本,但如何获得 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

最佳答案

:main 例程的生命周期内,SAMPLEFILE.csv 上有一个独占写锁。一旦 :main 例程返回,锁就会被释放。您可以通过添加延迟返回的命令来延长锁的长度。例如,timeout 60/nobreak >nul 会将锁的释放延迟 1 分钟。但我看不出这对你有什么好处。

锁只是防止其他进程写入文件。任何进程在锁定时仍然可以读取部分文件。可以detect if a file is locked by another process ,但我认为这对您的 SFTP 服务器没有帮助。

我认为防止部分下载文件的最简单方法是在 SFTP 帐户无法访问但位于同一卷上的文件夹中创建文件。文件完成后,您可以立即通过 MOVE 命令将其移动到正确的位置。在 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

关于windows - 如何使用 Windows 批处理脚本将文件独占锁定 1 分钟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32083874/

相关文章:

c++ - 列出 Win32 设备命名空间的内容

javascript - 在 Windows 中包含 JS 库

batch-file - 为什么在 "set/p"提示时使用 Ctrl+C 取消 Windows 批处理脚本会产生不一致的行为?

c# - 锁定在Framework 3.5与4.0之间?

java - 在Java中复制文件而不锁定原始文件

java - 该等待/通知代码性能异常

r - `seek` 在现代 Windows 上可靠吗?

c++ - 使用 Windows C++ LockFIle() 锁定文件然后从中获取流?

java - 如何从 %PATH% 而不是当前文件夹运行程序

powershell - 如何模拟批处理脚本