我正在编写一个以本地系统帐户运行的Windows服务。我正在尝试确保我是否对文件具有完全读/写访问权限,以便进一步处理它。这是我的代码:
Dim FullPath As String
FullPath = "C:\directory\file.txt"
Dim ps As Security.PermissionSet
ps = New Security.PermissionSet(Security.Permissions.PermissionState.Unrestricted)
ps.AddPermission(New Security.Permissions.FileIOPermission(Security.Permissions.FileIOPermissionAccess.AllAccess, FullPath))
ps.AddPermission(New Security.Permissions.FileIOPermission(Security.Permissions.FileIOPermissionAccess.AllAccess, IO.Path.GetDirectoryName(FullPath)))
Try
ps.Demand()
Catch ex As Security.SecurityException
System.Diagnostics.EventLog.WriteEntry("ShopLink", "File " + FullPath + " will not be parsed. " + ex.Message)
Exit Sub
Catch ex As Exception
System.Diagnostics.EventLog.WriteEntry("ShopLink", "File " + FullPath + " will not be parsed. " + ex.Message)
Exit Sub
End Try
然后,我将该服务运行的用户帐户的文件的完全访问权限设置为“拒绝”。执行后,上面的代码不会抛出任何异常,并允许文件处理开始。当服务稍后尝试更改和/或删除文件时,我会收到“拒绝访问”异常。
有什么建议吗?
答案 0 :(得分:2)
为此,我使用了这个小功能:
Private Function HasAccess(ByVal ltFullPath As String)
Try
Using inputstreamreader As New StreamReader(ltFullPath)
inputstreamreader.Close()
End Using
Using inputStream As FileStream = File.Open(ltFullPath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
inputStream.Close()
Return True
End Using
Catch ex As Exception
Return False
End Try
End Function
在你的情况下:
If HasAccess(FullPath) ...
答案 1 :(得分:1)
我通过使用My.Computer.FileSystem.DeleteFile删除文件而不是Kill来解决了这个问题。 My.Computer.FileSystem.DeleteFile在成功要求以上述方式对文件进行完全读/写访问后执行没有问题,而Kill始终抛出“拒绝访问”异常。
答案 2 :(得分:0)
使用“Kill”...我知道这是一个非常古老的线程,但我会添加这个以防万一有人像我一样偶然发现它。我正在研究一些旧的VB6遗留代码。我的一个客户端用户在kill之后打开文件时遇到运行时异常。代码是“杀死”文件,然后从头开始用内存中保存的二进制数据重建它。它确定“Kill”功能触发了用户的防病毒软件,该软件将文件锁定的时间足够长,导致下一个“打开”语句失败。我使用错误记录实用程序发现了这一点(此名称暂时逃脱了我)。失败的“打开”语句中的错误日志文件中的行是由于用户的防病毒软件而导致文件的状态为“删除待处理”。