From 758d18a652a157240bd80e9e2db7b47688ba3d3b Mon Sep 17 00:00:00 2001 From: LukePulverenti Luke Pulverenti luke pulverenti Date: Mon, 20 Aug 2012 19:53:32 -0400 Subject: Switched to low-level io methods for better performance --- MediaBrowser.Controller/IO/FileData.cs | 96 ++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 MediaBrowser.Controller/IO/FileData.cs (limited to 'MediaBrowser.Controller/IO/FileData.cs') diff --git a/MediaBrowser.Controller/IO/FileData.cs b/MediaBrowser.Controller/IO/FileData.cs new file mode 100644 index 000000000..843a7e8fe --- /dev/null +++ b/MediaBrowser.Controller/IO/FileData.cs @@ -0,0 +1,96 @@ +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); + } + } + +} -- cgit v1.2.3