C# 关于如何在c中从服务器访问大量文件的说明#

C# 关于如何在c中从服务器访问大量文件的说明#,c#,parsing,C#,Parsing,基本上,我希望访问1000个文本文件,输入它们的数据,将它们存储在sqlite数据库中,解析它们,然后向用户显示输出。到目前为止,我已经开发了一个只对一个文本文件执行此操作的程序 我想做什么:我们的服务器上有一个目录,大约有15个文件夹。每个文件夹中大约有30-50个文本文件。我想循环浏览每个文件夹,在每个文件夹中,循环浏览每个文件。一个很好的用户帮我处理了1000个文本文件,但我需要进一步澄清他的方法。这就是他的方法: private static void ReadAllFilesStar

基本上,我希望访问1000个文本文件,输入它们的数据,将它们存储在sqlite数据库中,解析它们,然后向用户显示输出。到目前为止,我已经开发了一个只对一个文本文件执行此操作的程序

我想做什么:我们的服务器上有一个目录,大约有15个文件夹。每个文件夹中大约有30-50个文本文件。我想循环浏览每个文件夹,在每个文件夹中,循环浏览每个文件。一个很好的用户帮我处理了1000个文本文件,但我需要进一步澄清他的方法。这就是他的方法:

 private static void ReadAllFilesStartingFromDirectory(string topLevelDirectory)
{
    const string searchPattern = "*.txt";
    var subDirectories = Directory.EnumerateDirectories(topLevelDirectory);
    var filesInDirectory = Directory.EnumerateFiles(topLevelDirectory, searchPattern);

    foreach (var subDirectory in subDirectories)
    {
        ReadAllFilesStartingFromDirectory(subDirectory);//recursion
    }

    IterateFiles(filesInDirectory, topLevelDirectory);
}

private static void IterateFiles(IEnumerable<string> files, string directory)
{
    foreach (var file in files)
    {
        Console.WriteLine("{0}", Path.Combine(directory, file));//for verification
        try
        {
            string[] lines = File.ReadAllLines(file);
            foreach (var line in lines)
            {
                //Console.WriteLine(line);   
            }
        }
        catch (IOException ex)
        {
            //Handle File may be in use...                    
        }
    }
}
private static void ReadAllFilesStartingFromDirectory(字符串topLevelDirectory)
{
常量字符串searchPattern=“*.txt”;
var subDirectories=Directory.EnumerateDirectories(topLevelDirectory);
var filesInDirectory=Directory.EnumerateFiles(topLevelDirectory,searchPattern);
foreach(子目录中的var子目录)
{
ReadAllFilesStartingFromDirectory(子目录);//递归
}
迭代文件(FileIndirectory,topLevelDirectory);
}
私有静态void iterateFile(IEnumerable文件,字符串目录)
{
foreach(文件中的var文件)
{
Console.WriteLine(“{0}”,Path.Combine(目录,文件));//用于验证
尝试
{
string[]lines=File.ReadAllLines(文件);
foreach(行中的var行)
{
//控制台写入线(行);
}
}
捕获(IOEX异常)
{
//句柄文件可能正在使用。。。
}
}
}
我的问题:

1) topLevelDirectory-我应该在那里放什么?这15个文件夹位于服务器上,其格式类似于\servername\randomfile\random\LocationOfTopLevel目录。但是,我如何在这里使用双斜杠(在路径名的开头)?这在c#中可能吗?我认为我们只能访问本地文件(例如:“c:\”——带有单斜杠而不是双斜杠的路径)


2) 我不明白第一个foreach循环的目的是什么。“readAllFilesStartingFromDirectory(subDirectory)”,是的,我们正在循环文件夹,但我们甚至没有使用该循环执行任何操作。它只是读取文件夹

我不想知道您的顶级目录,但基本上,如果您的文件位于C:\tmp中,那么您将传递它@“C:\tmp”。用@字符转义字符串以获得双斜杠(或单独转义每个斜杠)

string example0=@“\\some\network\path”
string example1=“\\\\some\\network\\path”


使用ReadAllFilesStartingFromDirectory,您可以递归调用IterateFile,它可以执行IterateFile在每个目录中所做的任何操作。使用上面粘贴的代码,这恰好没有起作用,因为Console.Writeline(line)被注释掉了。

我不知道您的顶级目录,但基本上如果您的文件位于C:\tmp中,那么您将传递它@“C:\tmp”。用@字符转义字符串以获得双斜杠(或单独转义每个斜杠)

string example0=@“\\some\network\path”
string example1=“\\\\some\\network\\path”


使用ReadAllFilesStartingFromDirectory,您可以递归调用IterateFile,它可以执行IterateFile在每个目录中所做的任何操作。对于上面粘贴的代码,这恰好没有起到任何作用,因为Console.Writeline(第行)被注释掉。

让我们澄清一下
topLevelDirectory
:这是一个文件夹,其中包含项目。不管这些是文件还是其他目录。这些包含其他“子文件夹”的目录可以包含文件夹本身

toplevelDirectory对您意味着什么:将您需要的所有文件封装在最低级别的文件夹中

toplevelfolder是包含15个要爬网的文件夹的目录

ReadAllFilesStartingFromDirectory(字符串topLevelDirectory)
您需要了解递归的含义。递归描述了一个调用自身的方法。 将函数名(ReadAllFilesStartingFromDirectory)与foreach循环中调用的函数名进行比较-它们是相同的

在您的情况下:该方法获取位于topfolder中的所有文件夹。然后,他循环遍历所有子文件夹。然后,每个子文件夹都成为toplevel文件夹,而toplevel文件夹又可以包含子文件夹,这些子文件夹将在下一次方法调用中成为toplevel文件夹。 这是在整个文件结构中循环的好方法。如果没有更多的子文件夹,将不会有任何递归,方法将结束

你的路径问题:你需要掩盖反斜杠。您可以通过在它们前面添加反斜杠来屏蔽它们

\path\randfolder\file.txt
将变成
\\path\\randfolder\\file.txt


或者在字符串之前设置@
var path=@“\path\randfolder\file.txt”
,这也为您提供了窍门。这两种方法都有效

让我们澄清一下
topLevelDirectory
:这是一个文件夹,其中包含项目。不管这些是文件还是其他目录。这些包含其他“子文件夹”的目录可以包含文件夹本身

toplevelDirectory对您意味着什么:将您需要的所有文件封装在最低级别的文件夹中

toplevelfolder是包含15个要爬网的文件夹的目录

ReadAllFilesStartingFromDirectory(字符串topLevelDirectory)
您需要了解递归的含义。递归描述了一个调用自身的方法。 将函数名(ReadAllFilesStartingFromDirectory)与foreach循环中调用的函数名进行比较-它们是相同的

在您的情况下:该方法获取位于topfolder中的所有文件夹。然后,他循环遍历所有子文件夹