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

时间:2015-10-05 17:30:25

标签: sql vb.net file-io filesystems

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

以下是我的代码。 (此代码运行大约10个小时,以完成200万行) 缺点是这段代码运行了一段时间。我想知道是否有更好/更快的方法来做到这一点?

这是我的代码。

 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

2 个答案:

答案 0 :(得分:1)

取决于想要“分析”的意思。

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

另一种选择是RoboCopy。仅在页眉/页脚被禁止的情况下运行列表(/ L),您将获得可以处理的制表符分隔文件。查看所有交换机选项 - http://ss64.com/nt/robocopy.html(例如,日志选项,/ BYTES,/ MIN。)不会像BySize那样汇总到目录。您可以将生成的文件批量加载到SQL Server中。

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

所有选项都是安装了操作系统的主题驱动器,不包括操作系统文件夹。

答案 1 :(得分:0)

解决方案:感谢用户rheitzman提醒批量负载。 我的解决方案就这样结束了。

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

dir > test.txt /b /s

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

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

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