繁体   English   中英

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

[英]clarification on how to access numerous files from server in c#

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

我想做什么:我们的服务器上有一个目录,其中包含约15个文件夹。 在每个文件夹中,大约有30-50个文本文件。 我想遍历每个文件夹,并在每个文件夹中遍历每个文件。 一个不错的用户帮助我完成了数千个文本文件的操作,但是我需要进一步阐明他的方法。 这是他的方法:

 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...                    
        }
    }
}

我的问题/问题:

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,您可以递归调用IterateFiles,它可以完成IterateFiles在每个目录中所做的任何事情。 使用上面粘贴的代码,由于Console.Writeline(line)被注释掉了,因此它什么也没做。

让我们澄清一下topLevelDirectory :这是一个文件夹,其中包含项目。 这些是文件还是其他目录都没有关系。 这些固定的其他“子文件夹”可以包含文件夹本身。

toplevelDirectory对您而言意味着什么:取一个文件夹,其中包含您可能需要的最低级别的所有文件。

您的顶层文件夹是包含要爬网的15个文件夹的目录。

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

如果您遇到这种情况:该方法将所有文件夹保存在顶层文件夹中。 然后,他遍历所有子文件夹。 然后,每个子文件夹都成为顶层文件夹,该文件夹又可以包含子文件夹,这些子文件夹将在下一个方法调用中成为顶层文件夹。 这是遍历整个文件结构的好方法。 如果没有更多的子文件夹,将没有任何递归并且方法结束。

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

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

或者您在字符串前设置一个@。 var path = @"\\path\\randfolder\\file.txt" ,这也可以帮您解决问题。 两种方式都可以

1)是的,在C#中是可能的。 如果您的程序具有对网络位置的访问权限,则可以使用:“ \\\\\\\\服务器名\\\\ randomfile \\\\ random \\\\ locationoftopleveldirectory”-字符串中的双斜杠,解释为一个斜杠。 或者您可以在字符串前使用@,这意味着'忽略转义字符'是斜杠,然后您的字符串将如下所示:@“ \\\\ servername \\ randomfile \\ random \\ locationoftopleveldirectory”

2)ReadAllFilesStartingFromDirectory是递归函数。 目录结构是分层的,因此很容易递归遍历它们。 该函数在根目录及其子目录及其所有子目录中查找文件...尝试对此循环添加注释,您将看到只有IterateFiles函数解析的根目录文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM