我在这里看到了一个非常接近的例子:
按日期排序
但是我是LINQ的新手,无法让它工作(不确定我是否理解DirectoryInfo或FileInfo类)。
下面是必要的代码片段:(赋值数组时):
string[] files = Directory.GetFiles(Server.MapPath("~/User_Saves/" + WebSecurity.CurrentUserName), "*.xml");
for(int i = 0; i < files.Length; i++)
{
files[i] = files[i].Substring(files[i].LastIndexOf("\") + 1);
files[i] = files[i].Substring(0, files[i].Length - 4);
}
(最后一部分,即'for循环',只是从字符串中剥离文件路径和唯一期望的文件扩展名,当然是".xml",只留下干净的文件名)。
(写入数组时):
[这段代码对于回答这个问题可能不是必需的,但只是以防万一]
@foreach(string file in files)
{
<p>
<button title="Permanently delete the requisition named, "@file"" type="button" id="@file" class="fileDelBtn">DEL</button> <span style="color: #000;">~</span> <span id="@file" class="listFile">@file</span>
</p>
hasSavedFiles = true;
}
我尝试过的事情:
string [] files = new DirectoryInfo(Server.MapPath("~/User_Saves/" + WebSecurity.CurrentUserName)).GetFiles().OrderBy(files => files.LastWriteTime).ToArray;
无法在此范围内声明名为'files'的局部变量,因为它会给'files'提供不同的含义,而'files'已在'父或当前'范围中用于表示其他内容
首先,我不能理解lambda运算符,为了我的生命,甚至在看了这里:http://msdn.microsoft.com/en-us/library/bb311046.aspx(对这一点的澄清,将是非常感激的,但无论如何,这不是真正的主要问题)。
其次,使用这个例子,我知道DirectoryInfo()没有接受2个参数的重载,所以我可能会失去只"获取"*.xml"文件的能力,我希望保留这种能力,但可能不是绝对必要的。
一如既往,任何帮助都是非常感谢的,如果有任何进一步的信息可以帮助你,请不要犹豫,问
var filesInOrder = new DirectoryInfo(path).GetFiles()
.OrderByDescending(f => f.LastWriteTime)
.Select(f => f.Name)
.ToList();
如果您不想马上枚举文件,就可以这样做。
public static IEnumerable<string> GetXmlFilesByLastWriteTime(string path)
{
var directoryInfo = new DirectoryInfo(path);
if(!directoryInfo.Exists) return Enumerable.Empty<string>();
var query =
from file in directoryInfo.GetFiles()
where file.Extension.ToLower() == ".xml"
orderby file.LastWriteTime
select file.Name;
return query;
}
用法:
var files = GetXmlFilesByLastWriteTime(path).ToList();