按文件名排序隐藏陷井、注意问题(序号文件名)
一般来说,文件默认按文件名排序,当用 C# 或 java 获取到某一目录下的所有文件时,这些文件就是按文件名排序的。大多情况下不会发生错误,如果文件名中包含序号,如 文件1、文件2、文件3,……,文件9、文件10、文件11,……,用循环取文件时就会发生错误,取到的可能不是预想的文件。
先看包含序号的文件名是如何按文件名排序的。仍用上面的例子,则按文件名排序为:文件1、文件10、文件11、文件2、文件3,……,文件9,……。“文件10、文件11”排到了“文件1”之后“文件2”之前,原本以为取最后一个文件名是“文件11”,结果错了。
C#文件名排序隐藏陷井示例:
假如获取某一文件夹中的所有文本文件,有些文件的文件名中包含序号,也就是上面的“文件1、文件2,……”。下面的代码先获取文件再输出按文件名排序的结果:
/// <summary>
/// C#文件名排序隐藏陷井示例
/// </summary>
/// <param name="filePath">路径</param>
/// <returns>文件名列表</returns>
private IList<string> GetFileNames(string filePath)
{
DirectoryInfo di = new DirectoryInfo(filePath);
FileInfo[] fi = di.GetFiles("*.txt");
IList<string> iFileName = new List<string>();
for (int i = 0; i < fi.Length; i++)
{
iFileName.Add(fi[i].Name);
}
return iFileName;
}
调用方法:
string filePath = @"G:\Design\txtfile";
IList<string> ifn = GetFileNames(filePath);
for (int i = 0; i < ifn.Count; i++)
{
Response.Write("<br />" + ifn[i]);
}
输出结果:
文件1
文件10
文件11
文件2
文件3
文件4
文件5
文件6
文件7
文件8
文件9
假如取最后一个文件名,如 ifn[ifn.Count - 1],预想应该取到文件11,按照输出结果看,取到的却是文件9,这就是按文件名排序隐藏的陷井,很容易忽略。举的虽然是 C# 的例子,java文件名排序同样要注意该问题。
如果想用 ifn[ifn.Count - 1] 取到最后一个文件,需要对所取得的文件按时间重新排序。