c# windows文件夹的“按名称排序功能”

郑炳贤 2015-05-16 04:47:52
明明window7,我按文件名称排序是1.jpg.2.jpg.3.jpg......10.jpg.11.jpg。怎么我用directory.getfile拿到的就是1.jpg.10.jpg.2.jpg!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

太坑了吧。搜了好多方法,都是拿过来正则表达式一下(因为读进来的文件哪有12345这么简单!)。反正很乱很复杂。


我只想要所见即所得。用户在外面看到的就是按window名称排序的。我想getfile返回的string数组也按照这个顺序。世界之大,.NEt发展这么久,难道就没人大神大哥知道吗。。。微软这个牛逼的按名称排序是什么方法,或者怎么做的啊啊。。。
...全文
854 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovezq85 2018-11-13
  • 打赏
  • 举报
回复
这个是调用windows的api来实现的!!!!5楼厉害啊!!!Windows api太多了,都搞不懂!!!
Richard__Hu 2016-12-31
  • 打赏
  • 举报
回复
1#楼的排序并不好,有漏洞,想要实现普通的按照windows系统的名称排序使用7#楼可以实现,甚至更复杂的情况,我已亲测。
baidu_36521046 2016-10-26
  • 打赏
  • 举报
回复
你好 一楼那个怎么运行的,没有装linq?
tenhilltree 2016-08-18
  • 打赏
  • 举报
回复
顶这个
引用 5 楼 x8bits 的回复:
[System.Runtime.InteropServices.DllImport("Shlwapi.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
private static extern int StrCmpLogicalW(string psz1, string psz2);

	string[] files = new string[] {"1.jpg", "2.jpg", "3.jpg", "10.jpg", "11.jpg", "20.jpg", "30.jpg"};
	Array.Sort(files, StrCmpLogicalW);
	foreach (var file in files)
	{
		Console.WriteLine(file);
	}
郑炳贤 2015-05-18
  • 打赏
  • 举报
回复
引用 8 楼 Z65443344 的回复:
什么所见即所得,你这里用错了措辞了 windows排序本来所见的就是explorer给你重新排序后的内容,跟文件如何在硬盘里存放无关 而你代码获取文件名称,也是要自己按某种规则排序 你想代码获取的跟windows排序相同,MS不可能. 没有接口获取windows排序方式. 就算你代码写死文件名按数字排序了,要是别人在windows里改成按修改时间排序,你这里不会跟着变的.
哦哦,知道自己表达错啦。 我只是想要 window按名称排序的顺序==我string[]数组的名字顺序..... 是因为我说的啰嗦啦,造成歧义了。。。 1楼跟7楼的 好像,都可以达到类似的名称排序效果。
於黾 2015-05-18
  • 打赏
  • 举报
回复
什么所见即所得,你这里用错了措辞了 windows排序本来所见的就是explorer给你重新排序后的内容,跟文件如何在硬盘里存放无关 而你代码获取文件名称,也是要自己按某种规则排序 你想代码获取的跟windows排序相同,MS不可能. 没有接口获取windows排序方式. 就算你代码写死文件名按数字排序了,要是别人在windows里改成按修改时间排序,你这里不会跟着变的.
郑炳贤 2015-05-18
  • 打赏
  • 举报
回复
引用 5 楼 x8bits 的回复:
[System.Runtime.InteropServices.DllImport("Shlwapi.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
private static extern int StrCmpLogicalW(string psz1, string psz2);

	string[] files = new string[] {"1.jpg", "2.jpg", "3.jpg", "10.jpg", "11.jpg", "20.jpg", "30.jpg"};
	Array.Sort(files, StrCmpLogicalW);
	foreach (var file in files)
	{
		Console.WriteLine(file);
	}
我用控制台也能得到应该有的结果。太棒了! 能请教一下这个是用到了哪个知识点吗。。。我方便去查找资料做笔记....多谢~
  • 打赏
  • 举报
回复
字符串按名字排序的确是1,10,2这种的,无论在sql还是在程序里都这样,你完全可以试下,win7那样排估计是做过优化的
x8bits 2015-05-17
  • 打赏
  • 举报
回复
[System.Runtime.InteropServices.DllImport("Shlwapi.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
private static extern int StrCmpLogicalW(string psz1, string psz2);

	string[] files = new string[] {"1.jpg", "2.jpg", "3.jpg", "10.jpg", "11.jpg", "20.jpg", "30.jpg"};
	Array.Sort(files, StrCmpLogicalW);
	foreach (var file in files)
	{
		Console.WriteLine(file);
	}
蒋晟 2015-05-17
  • 打赏
  • 举报
回复
写个IComparer 实现调用StrCmpLogicalW
threenewbee 2015-05-16
  • 打赏
  • 举报
回复
对的,你可以试试。
郑炳贤 2015-05-16
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
Directory.GetFiles().OrderBy(x => x.Length).ThenBy(x => x)
斑竹!~~~谢谢 string[] path= Directory.GetFiles(@"D:\1\").OrderBy(x => x.Length).ThenBy(x => x).ToArray(); 我这样用没错吧?好像刚可以运行。。。 是linq语言吗?
threenewbee 2015-05-16
  • 打赏
  • 举报
回复
Directory.GetFiles().OrderBy(x => x.Length).ThenBy(x => x)

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧