Lấy tệp theo ngày tạo trong .NET


92

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 đã tìm thấy một câu hỏi tương tự: stackoverflow.com/questions/52842/sorting-directory-getfiles
Senseful

4
GetFiles () không sắp xếp, việc sắp xếp chúng theo tên là một sự tình cờ. Chỉ cần tự mình sắp xếp.
Hans Passant

Câu trả lời:


198

đ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...
}

'System.IO.FileInfo []' không chứa một định nghĩa cho 'OrderBy'
Umair Jabbar

2
Đó là một phương pháp mở rộng ... msdn.microsoft.com/en-us/library/bb383977.aspx
Ivo

12
Tôi nghĩ không cần gọi phương thức ToArray ().
Ivo

AnyIdeas mà không sử dụng các phương thức mở rộng / LINQ vì tôi đang nhắm mục tiêu .NET 2.0
Pratik

10
Xem xét sử dụng info.GetFiles () OrderBy (p => p.CreationTimeUtc) thay vì CreationTime nếu có bất kỳ cơ hội các tập tin trong thư mục có thể được tạo ra trong múi giờ khác nhau (kể cả thời gian tiết kiệm ánh sáng ban ngày).
Steve

46

Bạn có thể sử dụng Linq

var files = Directory.GetFiles(@"C:\", "*").OrderByDescending(d => new FileInfo(d).CreationTime);

2
Giải pháp DirectoryInfo thì nhanh hơn nhiều (đặc biệt là đối với đường dẫn mạng)
jing

8

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);
});

4

Điều này trả về ngày sửa đổi cuối cùng và tuổi của nó.

DateTime.Now.Subtract(System.IO.File.GetLastWriteTime(FilePathwithName).Date)

1

@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

1

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à?.


0
            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());
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.