获取名称为

时间:2016-05-11 18:56:16

标签: c# directory .net-2.0

我有一个包含许多文件夹的目录,名称是始终在升序的数字。

示例:

1
2
3
4
5
6
7

所以,假设它们在c:\folders\

之内

要获取最后一个文件夹( 7 ),我会这样做:

string[] folders = Directory.GetDirectories("c:\folders\", "*",
                SearchOption.AllDirectories)

然后取出字符串的最后一个元素。

但是这个目录有5000多个文件夹,因此getdirectories大约需要1分钟才能运行。

为什么我这样做:

我有一个源目录和一个目标目录。我正在将源中的所有新文件夹及其内容复制到目标(是的,备份)。

这是我的代码目前所做的事情:

string[] directories = Directory.GetDirectories(source, "*",
                    SearchOption.AllDirectories);

foreach (string dirPath in directories)
    Directory.CreateDirectory(dirPath.Replace(source, target));

foreach (string newPath in Directory.GetFiles(source, "*.*",
    SearchOption.AllDirectories))
{
    if (!File.Exists(newPath.Replace(source, target)) && !newPath.Contains("\\Temp\\"))
    {
        File.Copy(newPath, newPath.Replace(source, target), false);
    }
}

获得最后一个文件夹后,我需要创建目录并将文件仅复制到源目录中的文件夹中。

那么,如何以更快的方式获取最高名称(数字)的文件夹?我可以创建一个TXT文件来跟踪最后插入的文件夹,但是有一个很好的技术可以修改额外的文件。

啊,源包含一些带字母的文件夹,例如 Temp 。我想忽略这些文件夹,只获取具有数字名称的文件夹。

我知道这个问题听起来有点过于宽泛,我不是要求任何人做我的工作,我只是想要一个想法,经过一些研究后我找不到合适的方法。

2 个答案:

答案 0 :(得分:0)

在很多情况下,我听说Directory.EnumerateDirectories(string path)在枚举方面要好得多。

var path = @"C:\test";
var highestNumberedDirectory = Directory.EnumerateDirectories(path)
                                    // Gets just the folder names without the full path
                                    .Select(d => ParseNumber(d.Split('\\').Last()))  
                                    // Orders the results by number. If you don't convert to int first then you'll start seeing some
                                    // ordering you might not expect. 1, 11, 2, 22, etc.
                                    .OrderBy(d=>d)
                                    // Gets the highest numbered result, ignoring nulls.
                                    .LastOrDefault(d => d != null);

private int? ParseNumber(string potentialNumber) {
    int result;
    if (int.TryParse(potentialNumber, out result)) {
        return result;
    }

    return null;
}

目录结构如下所示:

1
2
3
10
11
12
20
21
22
bad
__ok

并返回22.如果您需要完整路径,只需将其附加到原始路径

即可

答案 1 :(得分:0)

只需实施 IComparer 列表并比较路径中的最后一项 在类中称为 Stringcomparer

导入System.Collections

公共 Stringcomparer:实现IComparer(Of String)     公共函数比较(ByVal x As String,ByVal y As String)As Integer       实现IComparer(Of String)。比较

    x = Split(x, "\")(Split(x, "\").Length - 1)
    y = Split(y, "\")(Split(y, "\").Length - 1)
    Dim ix As Int16
    Dim iy As Int16

    If Not Integer.TryParse(x, ix) Then

        ix = -1

    End If

    If Not Integer.TryParse(y, iy) Then

        iy = -1

    End If



    If ix > iy Then


        Return 1

    End If

    If ix < iy Then


        Return -1

    End If

    ' Return 0
End Function

结束班

然后在代码中

    Dim FilesArray As String()
    FilesArray = Directory.GetDirectories(path)


    Dim ListofStrFile As New List(Of String)
    ListofStrFile.AddRange(FilesArray )

    ' take instance of Stringcomparer clases it to sort method 'method
    Dim dc As New Stringcomparer


    ListofStrFile.Sort(dc)