如何检查C驱动器VB.NET中是否存在文件/文件夹

时间:2019-06-02 15:27:25

标签: vb.net

我正在尝试创建一个简单的反作弊方法,以检测所有C驱动器中的外部作弊行为,但是我不知道如何检查所有C驱动器中是否存在确定文件,有帮助吗?

2 个答案:

答案 0 :(得分:0)

这是我从How to: Iterate Through a Directory Tree改编而成的代码。在该示例中,如果在FileExists()驱动器上的任何位置找到文件True,则bit32.txt函数将返回C。并非所有文件和目录都可以访问。在这种情况下,该函数将显示这些文件和目录的路径。在这种情况下,您可能需要修改代码以执行所需的操作。

Imports System.IO

Module Module1

    Private Sub Main(ByVal args() As String)
        Dim exists As Boolean = FileExists(New DriveInfo("C").RootDirectory, "bit32.txt")
    End Sub

    Private Function FileExists(ByVal root As DirectoryInfo, ByVal filename As String) As Boolean
        Dim files() As FileInfo = Nothing
        Dim subDirs() As DirectoryInfo = Nothing
        ' First, process all the files directly under this folder
        Try
            files = root.GetFiles("*.*")
        Catch e As Exception
            ' This code just writes out the message and continues to recurse.
            ' You may decide to do something different here. For example, you
            ' can try to elevate your privileges and access the file again.
            Console.WriteLine(e.Message)
        End Try

        If (Not (files) Is Nothing) Then
            For Each fi As FileInfo In files
                ' In this example, we only access the existing FileInfo object. If we
                ' want to open, delete or modify the file, then
                ' a try-catch block is required here to handle the case
                ' where the file has been deleted since the call to TraverseTree().
                'Console.WriteLine(fi.FullName);
                If (fi.Name = filename) Then
                    Return True
                End If

            Next
        End If

        Try
            ' Now find all the subdirectories under this directory.
            subDirs = root.GetDirectories
            For Each dirInfo As DirectoryInfo In subDirs
                ' Resursive call for each subdirectory.
                If FileExists(dirInfo, filename) Then
                    Return True
                End If

            Next
        Catch e As Exception
            ' This code just writes out the message and continues to recurse.
            ' You may decide to do something different here. For example, you
            ' can try to elevate your privileges and access the file again.
            Console.WriteLine(e.Message)
        End Try

        Return False
    End Function
End Module

答案 1 :(得分:0)

您可以在DirectoryInfo上使用扩展名,该扩展名以非递归方式遍历根目录以查找文件。

<Extension()>
Public Iterator Function GetFilesDepthFirst(ByVal root As DirectoryInfo, ByVal Optional dirPattern As String = "*", ByVal Optional filePattern As String = "*.*") As IEnumerable(Of FileInfo)
    Dim stack = New Stack(Of DirectoryInfo)()
    stack.Push(root)

    While stack.Count > 0
        Dim current = stack.Pop()
        Dim files = Enumerable.Empty(Of FileInfo)()
        Dim dirs = Enumerable.Empty(Of DirectoryInfo)()

        Try
            dirs = current.EnumerateDirectories(searchPattern:=dirPattern)
            files = current.EnumerateFiles(searchPattern:=filePattern)
        Catch ex1 As UnauthorizedAccessException
        Catch ex2 As PathTooLongException
        End Try

        For Each file As FileInfo In files
            Yield file
        Next

        For Each dir As DirectoryInfo In dirs
            stack.Push(dir)
        Next
    End While
End Function

然后您可以像这样轻松地调用它:

Dim dInfo = New DirectoryInfo("C:\")
Dim matches = dInfo.GetFilesDepthFirst(filePattern:="somefile.dll")
Dim exists = matches.Any()

此外,您在起始目录中的位置越具体,它将运行得越快。通常从C:\的根目录搜索是一个非常缓慢且糟糕的主意。