我试图将文件列表排序,没有成功。
它以递归方式获取文件但没有任何顺序。
这是代码:
private void Step2_Load(object sender, EventArgs e)
{
foreach (string file in GetFiles(PathClient))
{
string flist = "";
if (file.Contains(PathClient + "\\"))
flist = file.Replace(PathClient + "\\", "");
else
flist = file.Replace(PathClient, "");
LB_FULL.Items.Add(flist);
}
.
.
.
static IEnumerable<string> GetFiles(string path)
{
Queue<string> queue = new Queue<string>();
queue.Enqueue(path);
while (queue.Count > 0)
{
path = queue.Dequeue();
try
{
foreach (string subDir in Directory.GetDirectories(path))
queue.Enqueue(subDir);
}
catch (Exception ex)
{
//ex
}
string[] files = null;
try
{
files = Directory.GetFiles(path);
}
catch (Exception ex)
{
//ex
}
if (files != null)
{
for (int i = 0; i < files.Length; i++)
{
yield return files[i];
}
}
}
}
我尝试使用OrderBy,但它只按文件名排序,无论子文件夹如何。
我想先按子文件夹排序,然后按文件名排序。
代表
/
/file_a.bla
/file_b.bla
/file_c.bla
/sub1/file_a.bla
/sub1/file_b.bla
/sub2/_file_x.bla
/testsub/a.bla
...
等等。
如何管理它的任何想法?
答案 0 :(得分:0)
是否需要进行自己的递归搜索,还是可以使用Directory.GetFiles的相应重载?
无论如何,使用该重载,您可以按照我的意愿对文件进行排序(您没有提到如何订购子子目录):
string dirToSearch = @"C:\temp";
string[] files = Directory.GetFiles(dirToSearch, "*.*", SearchOption.AllDirectories);
var mySortedFiles = files.OrderBy(r => Path.GetDirectoryName(r)).
ThenBy(p => p.Count(c => c == Path.PathSeparator)).
ThenBy(s => Path.GetFileNameWithoutExtension(s)).
Select(t => t.Replace(dirToSearch, ""));
foreach (string s in mySortedFiles)
Console.WriteLine(s);
Console.ReadLine();
例如:
\CrossJoinA-H.sql
\ip-to-country.csv
\Kalimba.mp3
\LoadAssembly.sql
\ProcToUseAssembly.sql
\test.txt
\a\New Bitmap Image.bmp
\a\New Text Document.txt
\a\c\New Text Document.txt
\b\New Text Document.txt
\b\New Text Document (2).txt