我有一个包含许多文件夹的目录,名称是始终在升序的数字。
示例:
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 。我想忽略这些文件夹,只获取具有数字名称的文件夹。
我知道这个问题听起来有点过于宽泛,我不是要求任何人做我的工作,我只是想要一个想法,经过一些研究后我找不到合适的方法。
答案 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)