123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- using System;
- using System.IO;
- using System.Runtime.InteropServices;
- namespace MediaBrowser.Controller.IO
- {
- public static class FileData
- {
- public const int MAX_PATH = 260;
- public const int MAX_ALTERNATE = 14;
- public static WIN32_FIND_DATA GetFileData(string fileName)
- {
- WIN32_FIND_DATA data;
- IntPtr handle = FindFirstFile(fileName, out data);
- if (handle == IntPtr.Zero)
- throw new IOException("FindFirstFile failed");
- FindClose(handle);
- return data;
- }
- [DllImport("kernel32")]
- private static extern IntPtr FindFirstFile(string fileName, out WIN32_FIND_DATA data);
- [DllImport("kernel32")]
- private static extern bool FindClose(IntPtr hFindFile);
- }
- [StructLayout(LayoutKind.Sequential)]
- public struct FILETIME
- {
- public uint dwLowDateTime;
- public uint dwHighDateTime;
- }
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
- public struct WIN32_FIND_DATA
- {
- public FileAttributes dwFileAttributes;
- public FILETIME ftCreationTime;
- public FILETIME ftLastAccessTime;
- public FILETIME ftLastWriteTime;
- public int nFileSizeHigh;
- public int nFileSizeLow;
- public int dwReserved0;
- public int dwReserved1;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = FileData.MAX_PATH)]
- public string cFileName;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = FileData.MAX_ALTERNATE)]
- public string cAlternate;
- public bool IsDirectory
- {
- get
- {
- return dwFileAttributes.HasFlag(FileAttributes.Directory);
- }
- }
- public DateTime CreationTime
- {
- get
- {
- return ParseFileTime(ftCreationTime);
- }
- }
- public DateTime LastAccessTime
- {
- get
- {
- return ParseFileTime(ftLastAccessTime);
- }
- }
- public DateTime LastWriteTime
- {
- get
- {
- return ParseFileTime(ftLastWriteTime);
- }
- }
- private DateTime ParseFileTime(FILETIME filetime)
- {
- long highBits = filetime.dwHighDateTime;
- highBits = highBits << 32;
- return DateTime.FromFileTime(highBits + (long)filetime.dwLowDateTime);
- }
- }
- public struct LazyFileInfo
- {
- public string Path { get; set; }
- private WIN32_FIND_DATA? _FileInfo { get; set; }
- public WIN32_FIND_DATA FileInfo
- {
- get
- {
- if (_FileInfo == null)
- {
- _FileInfo = FileData.GetFileData(Path);
- }
- return _FileInfo.Value;
- }
- set
- {
- _FileInfo = value;
- }
- }
- }
- }
|