在处理VB.NET4.5中的文件之前,测试我是否具有完全的读/写权限
我正在编写一个作为本地系统帐户运行的windows服务。我试图确定我是否有对文件的完全读/写访问权,并开始进一步处理它。这是我的密码:在处理VB.NET4.5中的文件之前,测试我是否具有完全的读/写权限,vb.net,.net-4.5,vb.net-2010,Vb.net,.net 4.5,Vb.net 2010,我正在编写一个作为本地系统帐户运行的windows服务。我试图确定我是否有对文件的完全读/写访问权,并开始进一步处理它。这是我的密码: Dim FullPath As String FullPath = "C:\directory\file.txt" Dim ps As Security.PermissionSet ps = New Security.PermissionSet(Security.Permissions.PermissionState.Unrest
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
然后,我将运行服务的用户帐户的文件完全访问权限设置为“拒绝”。执行后,上面的代码不会抛出任何异常,并允许开始文件处理。当服务稍后尝试更改和/或删除该文件时,我收到一个“拒绝访问”异常
有什么建议吗?为此,我使用这个小功能:
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) ...
通过使用My.Computer.FileSystem.DeleteFile删除文件而不是Kill,我已经解决了这个问题。My.Computer.FileSystem.DeleteFile以上述方式成功请求对文件的完全读/写访问后,执行时没有出现问题,而Kill始终抛出“拒绝访问”异常。使用“Kill”。。。我知道这是一个非常古老的线程,但我会添加这个,以防有人像我一样偶然发现它。我正在处理一些旧的VB6遗留代码。我的一个客户机用户在kill后打开文件时遇到运行时异常。代码是“杀死”文件,然后用内存中的二进制数据从头开始重建它。“Kill”功能触发了用户的防病毒软件,该软件将文件锁定足够长的时间,导致下一个“Open”语句失败。我使用一个错误日志实用程序发现了这一点(我现在不知道这个名字)。错误日志文件中关于失败的“Open”语句的一行是,由于用户的防病毒软件,该文件的状态为“Delete pending”。我仍然有相同的问题。您提供的函数对给定文件返回true,但当我尝试使用Kill()删除该文件时,它会抛出一个异常,表示访问被拒绝。您确定该文件不是由另一个进程以独占方式打开的吗?或者该文件不是只读的?这两项都会阻止你删除或修改文件,即使你有权限这样做。是的,我完全肯定这一点。事实上,我回到这里只是想发布我通过使用My.Computer.FileSystem.DeleteFile而不是旧的Kill函数解决了这个问题。在我看来,出于某种奇怪的原因,Kill并没有删除具有与我的服务运行时相同的安全凭据的文件,或者它使Windows以不同的方式解释它们。无论如何,试图用Kill删除文件时抛出了一个“拒绝访问”异常。我认为
file.delete(filename)
也可以。