2

我正在编写一个作为本地系统帐户运行的 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

然后我将文件的完全访问权限设置为我的服务运行的用户帐户的“拒绝”。执行后,上面的代码不会抛出任何异常,并允许开始文件处理。当服务稍后尝试更改和/或删除文件时,我收到“拒绝访问”异常。

有什么建议么?

4

3 回答 3

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) ...
于 2013-08-14T08:01:58.913 回答
1

我已经通过使用 My.Computer.FileSystem.DeleteFile 删除文件而不是 Kill 解决了这个问题。My.Computer.FileSystem.DeleteFile 在以上述方式成功要求对文件进行完全读/写访问后没有问题地执行,而 Kill 始终抛出“拒绝访问”异常。

于 2013-08-14T23:48:54.597 回答
0

使用“Kill”......我知道这是一个非常古老的线程,但我会添加这个,以防有人像我一样偶然发现它。我正在处理一些旧的 VB6 遗留代码。我的一个客户用户在杀死后打开文件期间遇到运行时异常。该代码是“杀死”文件,然后使用内存中保存的二进制数据从头开始重建它。事实证明,“Kill”功能触发了用户的防病毒软件,该软件将文件锁定了足够长的时间,导致下一个“打开”语句失败。我使用错误记录实用程序发现了这一点(这个名字现在让我忘记了)。失败的“打开”语句的错误日志文件中的一行是由于用户的防病毒软件,该文件的状态为“删除未决”。

于 2016-11-23T12:12:56.950 回答