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/DirectoryWatchers.cs | 6 +- MediaBrowser.Controller/IO/FileData.cs | 96 +++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 MediaBrowser.Controller/IO/FileData.cs (limited to 'MediaBrowser.Controller/IO') diff --git a/MediaBrowser.Controller/IO/DirectoryWatchers.cs b/MediaBrowser.Controller/IO/DirectoryWatchers.cs index e4eadbbd0c..0a96990bfe 100644 --- a/MediaBrowser.Controller/IO/DirectoryWatchers.cs +++ b/MediaBrowser.Controller/IO/DirectoryWatchers.cs @@ -83,7 +83,7 @@ namespace MediaBrowser.Controller.IO List paths = affectedPaths; affectedPaths = new List(); - await ProcessPathChanges(paths); + await ProcessPathChanges(paths).ConfigureAwait(false); } private async Task ProcessPathChanges(IEnumerable paths) @@ -105,11 +105,11 @@ namespace MediaBrowser.Controller.IO return folder != null && folder.IsRoot; })) { - await Kernel.Instance.ReloadRoot(); + await Kernel.Instance.ReloadRoot().ConfigureAwait(false); } else { - await Task.WhenAll(itemsToRefresh.Select(i => Kernel.Instance.ReloadItem(i))); + await Task.WhenAll(itemsToRefresh.Select(i => Kernel.Instance.ReloadItem(i))).ConfigureAwait(false); } } diff --git a/MediaBrowser.Controller/IO/FileData.cs b/MediaBrowser.Controller/IO/FileData.cs new file mode 100644 index 0000000000..843a7e8fe3 --- /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