NativeMethodHelper
using Relativity.Transfer.Enumeration.Helpers;
using System;
using System.IO;
namespace Relativity.Transfer.Enumeration.Native
{
internal static class NativeMethodHelper
{
private const uint _NULL_ATTRIBUTE = uint.MaxValue;
public static long ToSize(NativeFindData findData)
{
return CombineHighLowInts(findData.nFileSizeHigh, findData.nFileSizeLow);
}
public static DateTime ToDateTime(NativeFindData findData)
{
return DateTime.FromFileTime(ToFileTime(findData));
}
internal static long ToFileTime(NativeFindData findData)
{
return CombineHighLowInts(findData.ftLastWriteTime_dwHighDateTime, findData.ftLastWriteTime_dwLowDateTime);
}
public static bool IsDirectory(NativeFindData findData)
{
return findData.dwFileAttributes.IsDirectory();
}
public static bool IsSymbolicLink(NativeFindData findData)
{
return findData.dwFileAttributes.IsSymbolicLink();
}
public static bool FileExists(string path)
{
string lpFileName = path.StartsWith("\\\\?\\") ? path : LongPathHelper.ToLongPath(path);
uint fileAttributes = NativeMethodsFactory.Create().GetFileAttributes(lpFileName);
if (fileAttributes != uint.MaxValue)
return !HasDirectoryFlag(fileAttributes);
return false;
}
public static bool DirectoryExists(string path)
{
string lpFileName = path.StartsWith("\\\\?\\") ? path : LongPathHelper.ToLongPath(path);
uint fileAttributes = NativeMethodsFactory.Create().GetFileAttributes(lpFileName);
if (fileAttributes != uint.MaxValue)
return HasDirectoryFlag(fileAttributes);
return false;
}
public static bool IsDotOrTwoDotPath(NativeFindData findData)
{
if (string.IsNullOrEmpty(findData.cFileName))
return false;
if (findData.cFileName[0] == '.') {
if (findData.cFileName.Length != 1) {
if (findData.cFileName[1] == '.')
return findData.cFileName.Length == 2;
return false;
}
return true;
}
return false;
}
private static long CombineHighLowInts(uint high, uint low)
{
return (long)(((ulong)high << 32) | low);
}
private static bool HasDirectoryFlag(uint attributes)
{
return ((FileAttributes)attributes).IsDirectory();
}
}
}