首先,对于长期问题感到抱歉,但我想提供足够的细节。
在Windows中似乎无法强制关闭通过网络共享打开的文件句柄。因此,无法移动/重命名/删除通过网络共享打开的文件。我正在使用Win 7。
任何人都可以看到我做错了或者有人确认这是预期的,并且不可能强制关闭系统文件句柄(总是在pid 4上,例如与网络共享访问文件相关的那些)。
我们有访问日志文件的远程网络客户端用户。我们需要滚动日志文件,使其不会变得太大。我们无法滚动日志文件,因为文件报告为正在使用。
以管理员身份执行所有操作
创建一个新目录并分享
在新目录中创建一个文件
通过文件共享编辑文件,其中的内容往往会像MS Word一样获得文件锁定。所以,开始/运行然后键入\ YourHostName然后选择您创建的文件共享,然后导航到该文件并使用Word进行编辑。这是为了模拟锁定文件的远程用户/主机。
列出打开的文件句柄,我们可以看到下面的2
C:>处理C:\ Log \ MyLockedFile.txt
处理第3.56节 版权所有(C)1997-2011 Mark Russinovich Sysinternals - www.sysinternals.com
系统pid:4类型:文件3E64:C:\ Log \ MyLockedFile.txt 系统pid:4类型:文件5E48:C:\ Log \ MyLockedFile.txt
尝试关闭文件句柄,在这里我们看到尝试关闭失败。
C:> handle -c 3E64 -p 4
处理第3.56节 版权所有(C)1997-2011 Mark Russinovich Sysinternals - www.sysinternals.com
3E64:文件(R--)C:\ Log \ MyLockedFile.txt 关闭系统中的手柄3E64(PID 4)? (是/否)y 关闭句柄时出错: 句柄无效。
列出网络文件句柄,这里我们看到打开的网络共享到文件。
C:> openfiles / query -v
信息:系统全局标志'维护对象列表'需要 启用以查看本地打开的文件。 见Openfiles /?了解更多信息。
通过本地共享点远程打开的文件:
按类型访问的主机名ID #Locks打开模式打开文件(路径\可执行文件) 14693W7N 67109233 myuser1 Windows 0写入+读取C:\ Log \ MyLockedFile.txt 14693W7N 495 myuser1 Windows 0读取C:\ Log \
关闭/断开文件的文件句柄,此处似乎可以正常工作
C:> openfiles / disconnect / a * / OP C:\ Log \ MyLockedFile.txt
成功:与已打开文件“C:\ Log \ MyLockedFile.txt”的连接已终止。
即使尝试删除系统文件句柄,系统文件句柄仍处于活动状态。
C:>处理C:\ Log \ MyLockedFile.txt
处理第3.56节 版权所有(C)1997-2011 Mark Russinovich Sysinternals - www.sysinternals.com
系统pid:4类型:文件3E64:C:\ Log \ MyLockedFile.txt
文件无法移动/重命名,因为它仍在使用中
C:>移动C:\ Log \ MyLockedFile.txt C:\ Log \ MyLockedFile.txt.newName 该进程无法访问该文件,因为该文件正由另一个进程使用。 移动了0个文件。
答案 0 :(得分:3)
只是张贴作为答案,因为看到这个问题无可救药地回答(嘿,通过神圣的机会,完全一年?)
首先,关于这个主题here(关于NTFS,我想),有一个非常有趣的讨论。如果你阅读上面的链接,你可以得到很好的提示,说明为什么有些句柄似乎永远“挂起”,为什么“强迫关闭”不是一个好主意。
“handle -c”给出无效句柄错误的原因可能与本地和远程运行“handle”有关,即在网络驱动器物理连接到的机器上(?)
出于我自己的目的,在我自己的场景中,我最终强行关闭一个句柄(因为我想以快速而肮脏的方式关闭它 - 使用你提到的Sysinternals工具,即“psexec”和“handle” “(无需指定用户和密码,因为我以管理员角色登录,我猜):
rem To list the open handles
psexec \\someserver -c handle /accepteula some_filename
rem To force close a particular handle
psexec \\someserver -c handle /accepteula -c 3F9C -p 4
但是当再次远程运行handle命令时没有给出任何结果(没有打开句柄),我试图删除的文件夹仍然被锁定。一段时间后(我也尝试使用“net use f:/ delete”断开与网络共享的连接而无济于事,因为它“正在被活动进程访问”) - 我发现我自己的本地机器是仍保留该目录的打开句柄 - 实际上我强行关闭的句柄来自我自己的机器。我使用Process Explorer GUI没有问题地关闭它们,这应该等于在命令提示符下使用“handle”。之后,可以删除相关文件夹。