Tôi có một thư mục chứa nhiều tệp. Có cách nào dễ dàng để lấy tên tệp trong thư mục được sắp xếp theo ngày / giờ tạo của chúng không?
Nếu tôi sử dụng Directory.GetFiles()
, nó trả về các tệp được sắp xếp theo tên tệp của chúng.
Tôi có một thư mục chứa nhiều tệp. Có cách nào dễ dàng để lấy tên tệp trong thư mục được sắp xếp theo ngày / giờ tạo của chúng không?
Nếu tôi sử dụng Directory.GetFiles()
, nó trả về các tệp được sắp xếp theo tên tệp của chúng.
Câu trả lời:
điều này có thể làm việc cho bạn.
using System.Linq;
DirectoryInfo info = new DirectoryInfo("PATH_TO_DIRECTORY_HERE");
FileInfo[] files = info.GetFiles().OrderBy(p => p.CreationTime).ToArray();
foreach (FileInfo file in files)
{
// DO Something...
}
Nếu bạn không muốn sử dụng LINQ
// Get the files
DirectoryInfo info = new DirectoryInfo("path/to/files"));
FileInfo[] files = info.GetFiles();
// Sort by creation-time descending
Array.Sort(files, delegate(FileInfo f1, FileInfo f2)
{
return f2.CreationTime.CompareTo(f1.CreationTime);
});
@jing: "Giải pháp DirectoryInfo thì nhanh hơn nhiều (đặc biệt là đối với đường dẫn mạng)"
Tôi không thể xác nhận điều này. Có vẻ như Directory.GetFiles kích hoạt hệ thống tệp hoặc bộ đệm mạng. Yêu cầu đầu tiên mất một lúc, nhưng các yêu cầu sau nhanh hơn nhiều, ngay cả khi các tệp mới đã được thêm vào. Trong thử nghiệm của tôi, tôi đã thực hiện một Directory.getfiles và một info.GetFiles với các mẫu giống nhau và cả hai đều chạy như nhau
GetFiles done 437834 in00:00:20.4812480
process files done 437834 in00:00:00.9300573
GetFiles by Dirinfo(2) done 437834 in00:00:20.7412646
Nếu hiệu suất là một vấn đề, bạn có thể sử dụng lệnh này trong MS_DOS:
dir /OD >d:\dir.txt
Lệnh này tạo một tệp dir.txt trong ** d: ** root có tất cả các tệp được sắp xếp theo ngày. Và sau đó đọc tệp từ mã của bạn. Ngoài ra, bạn thêm các bộ lọc khác theo * và?.
DirectoryInfo dirinfo = new DirectoryInfo(strMainPath);
String[] exts = new string[] { "*.jpeg", "*.jpg", "*.gif", "*.tiff", "*.bmp","*.png", "*.JPEG", "*.JPG", "*.GIF", "*.TIFF", "*.BMP","*.PNG" };
ArrayList files = new ArrayList();
foreach (string ext in exts)
files.AddRange(dirinfo.GetFiles(ext).OrderBy(x => x.CreationTime).ToArray());