【问题标题】:How do I avoid access denied (just checking a filename)如何避免访问被拒绝(仅检查文件名)
【发布时间】:2014-12-04 00:04:52
【问题描述】:

所以我在这里有一个非常基本的问题......我们有一个应用程序,它依赖于一个存储设置的 xml 文件。有时,此文件已损坏,应用程序将在启动时失败。我想编写一个应用程序来查找 USED 文件和 BACKUP 文件。由于各种原因(10 年的更改等),应用程序使用的文件并不总是存储在同一位置,但它始终命名相同。

所以我的想法是我编写了一个简单的应用程序,它可以查找系统上文件的所有情况(通常是一个或两个 HDD),很明显哪个是使用的,哪个是备份的。

简单...但是在使用此代码进行迭代时

Private Sub Command1_Click(sender As System.Object, e As System.EventArgs) Handles Command1.Click
    'variable to hold each hdd name eg: c:\
    Dim hdd As String




    Try

        For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
            'asign the variable hdd a name for this run through
            hdd = drive.Name

            'search the hdd for the file user.config

            For Each filename As String In IO.Directory.GetFiles(hdd, "user.config", IO.SearchOption.AllDirectories)

                'variable to hold the path for each found file
                Dim file As String = IO.Path.GetFullPath(filename)


                'add each found file to the list
                List1.Items.Add(file)

            Next


        Next

    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
    'iterate through each found drive





End Sub

我遇到的问题是访问被拒绝...

所以我认为我应该能够在对它进行任何操作之前检查权限?但是后来我想我实际上并没有尝试做任何事情,只是读对了吗?还是我错过了什么……

我尝试过更改权限,以管理员身份运行 VS2010 等,但这些都不起作用。

TIA

【问题讨论】:

    标签: vb.net visual-studio-2010


    【解决方案1】:

    RtBackup 是一个系统文件夹,如果您查看权限,只有系统(甚至不是管理员)可以访问它。我想您可以将程序作为系统运行,但这听起来很愚蠢。我会捕获异常,可能会将其记录在某处或显示控制台消息并继续前进。

    【讨论】:

    • 好吧,这就是我想我很愚蠢的地方。我认为 try catch 会这样做,但它退出了。我得看看我在那里错过了什么......感觉我会在大约 3 分钟内感到愚蠢。
    【解决方案2】:

    您说:“我尝试过更改权限,以管理员身份运行 VS2010 等。这些都不起作用。”

    当您说“尝试更改权限”时,您是什么意思?您尝试更改权限的原因是什么?正如您发现的那样,以管理员身份运行 VS 没有任何好处。

    问题在于文件夹 RtBackup 的权限。一种选择(也许不是最好的?)是去

    C:\Windows\System32\LogFiles\WMI
    

    右键单击 RtBackup 文件夹并选择属性,转到安全选项卡,编辑,添加,在底部框中键入“所有人”,单击确定。在“Rtbackup 的权限”窗口中,确保突出显示“所有人”,然后赋予它完全控制权。好的。好的。

    请记住,在执行此操作时,您已经打开了该文件夹,以便所有人和所有内容都可以完全访问。这可能足以进行测试。当您想要发布时,您需要做什么来找出(或指定)您的应用以哪个用户身份运行,并授予该用户读取权限。

    编辑:

    如果你想使用 try-catch 来跳过你没有权限的情况,那么你的代码格式如下:

        For Each drive As IO.DriveInfo In IO.DriveInfo.GetDrives
    
            'asign the variable hdd a name for this run through
            hdd = drive.Name
    
            Try
    
                'search the hdd for the file user.config
                For Each filename As String In IO.Directory.GetFiles(hdd, "user.config", IO.SearchOption.AllDirectories)
    
                'variable to hold the path for each found file
                    Dim file As String = IO.Path.GetFullPath(filename)
    
                    'add each found file to the list
                    List1.Items.Add(file)
    
                Next
    
            Catch ex As Exception
               ' handle error here, or just do nothing
            End Try
    
        Next
    

    【讨论】:

    • "尝试更改权限" 我的意思是尝试更改应用程序权限。我认为这实际上是我的一个非常愚蠢的错过。我从来没有过多地处理过捕获错误......非常简单的应用程序,这不是问题。我有try catch,我认为这会捕获一个错误,然后返回处理代码,但它没有。我从来没有想过这里的正确行为是查找文件,并且在每种情况下我都没有权限只是跳过它。这就是我认为使用 try/catch 会发生的事情,而当这种情况没有发生时,我只是继续前进……我正在努力
    • 嗯,你是对的,try-catch 可以用来跳过你没有权限的情况。但是你只需要稍微不同的格式。我不认为代码在 cmets 中有效,所以我将在上面编辑我的答案,说明如何使它工作。
    • 感谢您的帮助...但我想我在编辑后看到了与您指出的相同的问题。我在它尝试查看的第一个文件/目录上收到错误,然后退出该文件/下一个。我确实按照您的建议进行了编辑
    • 我真的不明白出了什么问题... for/next 在第一次运行时抛出错误并且刚刚退出。我在这里遗漏了一些简单的东西......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多