1

我正在尝试在 VB 2010 Express (.Net Framework 4.5) 中构建一个简单的例程,该例程从我的夜间数据库备份文件夹中删除旧文件。每当我尝试将 ReadOnly 状态设置为 false(以确保可以删除)或删除文件时,我都会收到“System.ArgumentException:拒绝访问路径”错误。

我已经为此奋斗了两天,并多次重写了代码,但总是得到相同的结果。当我查看指定文件的属性时,一切看起来都很完美。

这是属性的图像。. .

<< WOOPS- 我很想能够在这里发布我的图片以提供帮助,但不可能发布新帖子。希望这种手工打字的努力就足够了。>>

_data              {Microsoft.Win32.Win32Native.WIN32_RLE_ATTRIBUTE_DATA}
_datalnitialised    0
Attributes  Archive {32}
CreationTime        #5/17/20131:57:45 AM*
CreationTimeUtc     #5/17/2013 5:57:45 AM#
Directory           {C:\powerhome\Database\dbAutoBaks}
DirectoryName       "C:\powerhome\Database\dbAutoBaks"
DisplayPath         "ph-130517.db"
ERROR_ACCESS_DENIED  5
Exists               True
Extension            ".db"
FullName             "C:\powerhome\Database\dbAutoBaks\ph-130517.db"
FullPath             "C:\powerhome\Database\dbAutoBaks\ph-130517.db"
IsReadOnly           False
LastAccessTime       #5/17/20131:57:45 AM#

这是我的代码。. .

Imports System
Imports System.IO
Imports System.Security.AccessControl

Public Class phFileTrim

Private Sub fileTrim_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim text As String
    Dim UserAccount As String = "Administrators"
    Dim intdays As Integer = 30
    Dim folderPath As String = "C:\powerhome\Database\dbAutoBaks"
    Dim fi As IO.FileInfo = New IO.FileInfo(folderPath)

    'Check out System.IO.FileInfo Class tutorial

    For Each fi In New IO.DirectoryInfo(folderPath).GetFiles("*.*")
        Try
            fi.IsReadOnly = False
            If fi.Exists Then
                If (Now - fi.CreationTime).Days > intdays Then fi.Delete()
            End If
        Catch ex As Exception
            text = "File Delete Failed: " & ex.ToString
            MsgBox(text)
        End Try
    Next
    Me.Close()
End Sub
End Class

该错误由FileInfo.IsReadOnly = FalseFileInfo.Delete() 操作之一触发。

查看变量的调试属性弹出窗口,我发现“fi”似乎是问题所在。定义后对它的所有使用似乎都有 access denied=5 错误。因此怀疑我错误地形成了“Dim fi As IO.FileInfo = New IO.FileInfo(folderPath)”语句。

任何想法将不胜感激。看起来这不应该是火箭科学,但我肯定错过了一些东西。

==星期一早上===

我只是简化了所有内容并将复杂的“Dim fi As IO.FileInfo = New IO.FileInfo(folderPath)”更改为 . . .

 Dim fi As New FileInfo("C:\powerhome\Database\dbAutoBaks\ph-130517.db")

这是存在的特定文件的完全限定路径,但是当 fi 被标注时我仍然遇到访问错误。

该文件与 VB 代码位于同一台计算机上,但在调试时遇到此错误。我还没有尝试运行这个程序的可执行文件。执行时它将位于 powerhome 目录中。

== 星期一上午 9 点 === 即使是这个简单的代码也会引发 ACCESS_DENIED 错误 5。(这是来自 MSDN 官方示例库!)

Imports System
Imports System.IO

Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles MyBase.Load
    Dim path1 As String = Path.GetTempFileName()
    Dim finfo As FileInfo = New FileInfo(path1)
End Sub
End Class

我已确保我的 app.manifest 执行级别设置为 . . .

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

但仍然没有成功。

到底是什么阻止了我的文件访问?

:-(

4

1 回答 1

1

问题解决了。

我在执行第一个“fi”代码时收到的“ERROR_ACCESS_DENIED 5”属性根本不是错误。显然 ERROR_ACCESS_DENIED 是“fi”对象的属性,就像 IsReadOnly 一样。“5”表示“一切都好”。

当我第一次开始调试我的例程并在我的 fi 尺寸标注中遇到严重错误时,我看到了 ACCESS_ERROR 并认为这就是问题所在。

通过随后几天的调试,我一直在尝试摆脱 ACCESS_ERROR 而不检查我的代码是否真的没问题。

在某个地方,我的代码变得没有错误,直到另一个程序员提出了一些他知道可以工作的试用代码,我才发现这一点,但我仍然遇到了 ACCESS_ERROR。

他指出这并不是真正的错误,当我尝试我的代码时,它运行良好(但 ERROR_ACCESS_DENIED 的值仍然为 5,这没问题)。

我从未在 MSDN 文档中找到任何指示 ACCESS_ERROR 的值的内容。5 的值在一个文档中列出,我认为这是一个错误值,但显然不是。

于 2013-06-22T11:15:13.427 回答