为什么我对照片的排序总是与Windows系统的不一样呢?
我们在文件夹中有一批图片,在进行查看的时候,当排序方式是日期的时候,到底是按照怎么样的顺序排列的呢?
在 c# 里面,我们尝试把它认为是图片的创建时间(new FileInfo("F:\\1.png").CreationTime), 也尝试让它是图片的最后修改时间(new FileInfo("F:\\1.png").LastWriteTime), 也尝试使用 Shlwapi.DLL:
[System.Runtime.InteropServices.DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)] private static extern int StrCmpLogicalW(string param1, string param2);,但是都没有看到与系统一致的顺序。尤其对于图片的创建时间,当我们把图片拷贝到另外一台电脑的时候,它的创建时间又进行了更新。
不过,我们突然发现了图片包含了非常丰富的属性:
发现了没?这里的拍摄日期就是我们需要的排序时间, 按照 EXIF 标签 里面这个时间排序,得到的结果与系统排序的顺序是完全一致的:
// EXIF 标签:拍摄原图时间 / 数字化时间 / 修改时间 private static readonly int[] DateTakenIds = { 0x9003, 0x9004, 0x0132 }; public static DateTime? TryGetDateTaken(string path) { using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (var img = Image.FromStream(fs, useEmbeddedColorManagement: false, validateImageData: false)) { foreach (var id in DateTakenIds) { if (Array.IndexOf(img.PropertyIdList, id) < 0) continue; var prop = img.GetPropertyItem(id); // EXIF 字符串形如 "2026:06:26 13:52:00" var s = Encoding.ASCII.GetString(prop.Value).Trim('\0', ' ', '\r', '\n'); if (DateTime.TryParseExact(s, "yyyy:MM:dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var dt)) return dt; } } return null; // 没有拍摄信息 }