我遇到了以下问题。
我有一个连接到远程sql服务器的数据库。 所有必需的模拟操作都已完成-换句话说,我已经具有对文件系统和sql服务器的所有访问权限。
假设我有FileStreanDB1
sql数据库:
\\server\C$\MSSQL\Data\FileStreamDB1.mdf
\\server\C$\MSSQL\Data\FileStreamDB1_log.ldf
\\server\C$\MSSQL\Data\FileStreamDB1
在某些时候,我想删除该数据库。 因此,我只使用以下sql语句(我使用c#调用此代码):
DROP DATABASE [FileStreamDB1]
此后,数据库被删除,所有文件也被删除(如果我去那个服务器,我找不到它们-文件和目录确实被删除了)。
但是不幸的是,以下代码告诉我\\server\C$\MSSQL\Data\FileStreamDB1
仍然存在。
new DirectoryInfo(@"\\server\C$\MSSQL\Data\FileStreamDB1").Exists // returns true
Directory.Exists(@"\\server\C$\MSSQL\Data\FileStreamDB1") // returns true
看起来好像有关已缓存目录的信息,我需要清理现金 (SMB2目录缓存,我不想禁用它)
我也尝试这样做:
new DirectoryInfo(@"\\server\C$\MSSQL\Data\FileStreamDB1").Refresh().Exists // return true
有什么想法可以使用c#清除有关unc路径的Windows缓存吗?
答案 0 :(得分:2)
问题是远程信息在注册表中可配置的一定时间范围内被缓存。
所有代码将首先从缓存中读取,得到File.Exists=true
的结果,直到使缓存无效为止。
我发现了几种方法可以从代码中绕开此缓存。
尝试访问服务器unc $NOCSC$
,这将绕过client-side cache
。 (注意:这在Windows Server上不起作用)。
就像这样:Directory.Exists(@"\\server$NOCSC$\C$\MSSQL\Data\FileStreamDB1")
。
另外,看起来FileSystemWatcher
看着指定的文件夹也会绕过缓存。 (我自己没有尝试过,如果我错了,请纠正我)
注意:从Windows资源管理器观看unc路径也会绕过缓存,但仅针对该窗口,而不针对运行的任何其他代码。
来源: