如何分析1TB硬盘中的文件和文件夹?

how to analyze files and folders in 1TB hard drive?

我遇到了分析 1 TB 文件和文件夹的挑战。我的第一个想法和尝试是使用 System.IO getfiles(targetdirecotry)。 所以我创建了一个程序来递归到所有文件夹并获取所有文件。 对于每个文件,我将它们插入 SQL Table。一旦所有文件夹和文件都在 SQL table 中,我就可以轻松分析和编写客户想要的任何报告。

下面是我的代码。 (此代码运行约 10 小时,完成 200 万行) 缺点是这段代码会运行一段时间。我想知道是否有 better/faster 方法可以做到这一点?

这是我的代码。

 Public Sub getFilesInDirectory(sPath As String)
        If File.Exists(sPath) Then
            ' This path is a file.
            ProcessFile(sPath)
        Else
            If Directory.Exists(sPath) Then
                ' This path is a directory.
                ProcessDirectory(sPath)
            Else
                Console.WriteLine("{0} is not a valid file or directory.", sPath)
            End If
        End If
        MsgBox("DONE" & Now)
    End Sub
' Process all files in the directory passed in, recurse on any directories that are found, and process the files they contain. 

Public Sub ProcessDirectory(ByVal targetDirectory As String)
    Dim fileEntries As String() = Directory.GetFiles(targetDirectory)
    ' Process the list of files found in the directory. 
    Dim fileName As String
    For Each fileName In fileEntries
        Console.WriteLine("Processed file '{0}'.", fileName)
        ProcessFile(fileName)
    Next fileName
    Dim subdirectoryEntries As String() = Directory.GetDirectories(targetDirectory)
    ' Recurse into subdirectories of this directory. 
    Dim subdirectory As String
    For Each subdirectory In subdirectoryEntries
        ProcessDirectory(subdirectory)
    Next subdirectory
End Sub 'ProcessDirectory

' Insert logic for processing found files here. 
Public Sub ProcessFile(ByVal path As String)
    Dim SQLString As String
    Dim dt As New DataTable
    SQLString = " insert into FileTable (Path, CreatedDate, ModifiedDate, IsDeleted, FileOwner) "
    SQLString = SQLString & " values('" & path & "','" & DateTime.Parse(getCreationTime(path)) & "','" & DateTime.Parse(getModifiedTime(path)) & "'," & 0 & ",'" & getOwner(path).ToString & "')"
    Call ExecuteSQL(SQLString)
End Sub 'ProcessFile

很大程度上取决于想要"analyze"的意思。

如果您只想查找超大文件或文件夹,我会使用像 BYSIZE 这样的实用程序 http://www.semaphorecorp.com/bysize/bysize.html 您必须 运行 手动保存结果,但这是我最快的方法'已经看到任务了。

另一个选项是 RoboCopy。 运行 列表 (/L) 只有 header/footer 被抑制,您将得到一个制表符分隔的文件,您可以处理。检查所有开关选项 - http://ss64.com/nt/robocopy.html(例如日志记录选项、/BYTES、/MIN。)不像 BySize 那样汇总到目录。您可以将生成的文件批量加载到 SQL 服务器。

我猜你的 OP 代码中最慢的部分是 INSERT 逻辑。此外,如果您正在进行大量插入,事务日志记录和缓存可能是一个真正的问题。您可以继续您的路径,但使用 stringbuilder 并每 10,000 条记录左右将制表符分隔的数据写入磁盘。然后将数据批量加载到SQL Server.

所有选项都是主题驱动器安装了 OS,排除了 OS 文件夹。

SOLUTION:感谢用户rheitzman提醒批量加载。 我的解决方案最终是这样的。

将文件和文件夹放到文本文件中

dir > test.txt /b /s

然后使用批量加载将文本文件插入 SQL table

BULK INSERT nProject FROM 'c:\test.txt' WITH (FIELDTERMINATOR = ',',ROWTERMINATOR = '\n')

这个批量加载只需要不到 40 分钟就可以处理 200 万行(从 10 小时到 40 分钟)我很高兴。谢谢!