public static string getFileUniqueSystemID(string fileName) { bool fileRead = false; string fileId = "-1"; while (!fileRead) { try { FileStream strem = File.Open(fileName, FileMode.Open); BY_HANDLE_FILE_INFORMATION hInfo = new BY_HANDLE_FILE_INFORMATION(); GetFileInformationByHandle(strem.SafeFileHandle, out hInfo); fileId = hInfo.FileIndexHigh.ToString() + hInfo.FileIndexLow.ToString() + "|" + hInfo.VolumeSerialNumber.ToString(); strem.Close(); fileRead = true; } catch (IOException e) { if (e is FileNotFoundException || e is PathTooLongException) { fileRead = true; } else { Thread.Sleep(100); } } catch (System.UnauthorizedAccessException) { fileRead = true; } } return(fileId); }
/// <summary> /// Checks if two file paths are identical. /// </summary> /// <param name="P1">Path 1</param> /// <param name="P2">Path 2</param> /// <remarks> /// At least one file has to exist /// </remarks> /// <returns>true, if identical</returns> public static bool ComparePath(string P1, string P2) { //Consider two null strings identical if (P1 == null && P2 == null) { return(true); } //Throw if only one arg is null if (P1 == null) { throw new ArgumentNullException("P1"); } //Throw if only one arg is null if (P2 == null) { throw new ArgumentNullException("P1"); } //Consider Paths equal if strings are if (P1 == P2) { return(true); } //Fail if both files don't exist if (!File.Exists(P1) && !File.Exists(P2)) { throw new ArgumentException("At least one argument needs to point to an existing file"); } //Consider Paths unequal if one of the files doesn't exists if (!File.Exists(P1) || !File.Exists(P2)) { return(false); } using (SafeFileHandle sfh1 = CreateFile(P1, FileAccess.Read, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, (FileAttributes)0x02000080, IntPtr.Zero)) { if (sfh1.IsInvalid) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } using (SafeFileHandle sfh2 = CreateFile(P2, FileAccess.Read, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, (FileAttributes)0x02000080, IntPtr.Zero)) { if (sfh2.IsInvalid) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } var fileInfo1 = new BY_HANDLE_FILE_INFORMATION(); var fileInfo2 = new BY_HANDLE_FILE_INFORMATION(); if (!GetFileInformationByHandle(sfh1, out fileInfo1)) { throw new Win32Exception(); } if (!GetFileInformationByHandle(sfh2, out fileInfo2)) { throw new Win32Exception(); } return(fileInfo1.FileEquals(fileInfo2)); } } }
public static void GetFileInformation(string path, out BY_HANDLE_FILE_INFORMATION info) { using (FileStream file = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { if (!GetFileInformationByHandle(file.SafeFileHandle, out info)) { throw new Win32Exception(); } } }
public uint Def_GetFileInformation(string fileName, ref BY_HANDLE_FILE_INFORMATION information, IntPtr info) { try { RegistryFileBlock FileBlock = new RegistryFileBlock(fileName); if (FileBlock.level == 1) { information.FileAttributes = (uint)FileAttributes.Directory; information.LastAccessTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime()); information.LastWriteTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime()); information.CreationTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime()); return(0); } RegistryKey key = GetRegistoryEntry(FileBlock); if (key == null) { return(0xC0000467); } if (FileBlock.level == 3) { // fileName = fileName.Remove(fileName.LastIndexOf(".")); string value; if (key.GetValue(FileBlock.ValueName) == null)//.ToString(); { value = ""; } else { value = key.GetValue(FileBlock.ValueName).ToString(); } information.FileAttributes = (uint)FileAttributes.Readonly; information.FileSizeLow = (uint)value.Length; information.LastAccessTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime()); information.LastWriteTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime()); information.CreationTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime()); return(0); } information.FileAttributes = (uint)FileAttributes.Directory; information.LastAccessTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime()); information.LastWriteTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime()); information.CreationTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime()); return(0); } catch (Exception ex) { Console.WriteLine("Error : {0}", ex.Message); return(0xC0000467); } }
public static int GetFileLinkCount(string filepath) { using (var handle = CreateFile(filepath, FileAccess.Read, FileShare.Read, IntPtr.Zero, FileMode.Open, FileAttributes.Archive, IntPtr.Zero)) { if (handle.IsInvalid) return 0; var fileInfo = new BY_HANDLE_FILE_INFORMATION(); if (GetFileInformationByHandle(handle, out fileInfo)) return (int)fileInfo.NumberOfLinks; } return 0; }
public static int GetFileLinkCount(string filepath) { int result = 0; SafeFileHandle handle = CreateFile(filepath, FileAccess.Read, FileShare.Read, IntPtr.Zero, FileMode.Open, FileAttributes.Archive, IntPtr.Zero); BY_HANDLE_FILE_INFORMATION fileInfo = new BY_HANDLE_FILE_INFORMATION(); if (GetFileInformationByHandle(handle, out fileInfo)) { result = (int)fileInfo.NumberOfLinks; } CloseHandle(handle); return(result); }
public static int GetFileLinkCount(string filepath) { using (var handle = CreateFile(filepath, FileAccess.Read, FileShare.Read, IntPtr.Zero, FileMode.Open, FileAttributes.Archive, IntPtr.Zero)) { if (handle.IsInvalid) { return(0); } var fileInfo = new BY_HANDLE_FILE_INFORMATION(); if (GetFileInformationByHandle(handle, out fileInfo)) { return((int)fileInfo.NumberOfLinks); } } return(0); }
private bool internal_is_same_volume(IntPtr h1, IntPtr h2) { BY_HANDLE_FILE_INFORMATION info1 = new BY_HANDLE_FILE_INFORMATION(); BY_HANDLE_FILE_INFORMATION info2 = new BY_HANDLE_FILE_INFORMATION(); int res = Native.GetFileInformationByHandle(h1, ref info1); if (res == 0) { return(false); } res = Native.GetFileInformationByHandle(h2, ref info2); if (res == 0) { return(false); } return(info1.dwVolumeSerialNumber == info2.dwVolumeSerialNumber); }
public uint GetFileSystemId(FileInfo file) { BY_HANDLE_FILE_INFORMATION objectFileInfo = new BY_HANDLE_FILE_INFORMATION(); try { using (FileStream fs = file.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { GetFileInformationByHandle(fs.SafeFileHandle.DangerousGetHandle(), out objectFileInfo); } } catch (Exception) { return(0); } uint fileIndex = (objectFileInfo.FileIndexHigh << 32) + objectFileInfo.FileIndexLow; return(fileIndex); }
public bool Is(string path) { if (File.GetAttributes(path).HasFlag(FileAttributes.Directory)) { return(false); } BY_HANDLE_FILE_INFORMATION objectFileInfo = new BY_HANDLE_FILE_INFORMATION(); FileInfo fi = new FileInfo(path); FileStream fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite); GetFileInformationByHandle(fs.Handle, out objectFileInfo); fs.Close(); return(objectFileInfo.NumberOfLinks > 1); }
public static bool CalculateFileId(string path, out BY_HANDLE_FILE_INFORMATION hfi) { hfi = new BY_HANDLE_FILE_INFORMATION { }; IntPtr file = CreateFile(path, 0, 0, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero); if (file.ToInt32() == INVALID_HANDLE_VALUE) { return(false); } bool ret = GetFileInformationByHandle(file, ref hfi); CloseHandle(file); if (!ret) { return(false); } return(true); }
public uint Def_GetFileInformation(string filename, ref BY_HANDLE_FILE_INFORMATION Information, IntPtr info) { VNode Node = new VNode(filename); Console.WriteLine("{0} {1} {2}", Node.isFile, Node.rootDir, Node.curDir); if (Node.isValid) { Information.CreationTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime()); Information.LastAccessTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime()); Information.LastWriteTime = HelperFunction.DateTimeToFileTime(DateTime.Now.ToFileTime()); Information.FileSizeLow = 100000; if (Node.isFile) { Information.FileAttributes = FileAttributes.Readonly; } else { Information.FileAttributes = FileAttributes.Directory | FileAttributes.Readonly; } } return(0); }
private void GetRootFrnEntry(string drive) { string driveRoot = string.Concat("\\\\.\\", drive); driveRoot = string.Concat(driveRoot, Path.DirectorySeparatorChar); IntPtr hRoot = NativeWrapper.CreateFile(driveRoot, 0, NativeWrapper.FILE_SHARE_READ | NativeWrapper.FILE_SHARE_WRITE, IntPtr.Zero, NativeWrapper.OPEN_EXISTING, NativeWrapper.FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero); if (hRoot.ToInt32() != NativeWrapper.INVALID_HANDLE_VALUE) { BY_HANDLE_FILE_INFORMATION fi = new BY_HANDLE_FILE_INFORMATION(); bool bRtn = NativeWrapper.GetFileInformationByHandle(hRoot, out fi); if (bRtn) { UInt64 fileIndexHigh = (UInt64)fi.FileIndexHigh; UInt64 indexRoot = (fileIndexHigh << 32) | fi.FileIndexLow; FileNameAndParentFrn f = new FileNameAndParentFrn(driveRoot, 0); _directories.Add(indexRoot, f); } else { throw new IOException("GetFileInformationbyHandle() returned invalid handle", new Win32Exception(Marshal.GetLastWin32Error())); } NativeWrapper.CloseHandle(hRoot); } else { throw new IOException("Unable to get root frn entry", new Win32Exception(Marshal.GetLastWin32Error())); } }
/// <summary> /// 把远程file handle复制到本地进程 /// 然后获取文件名 /// </summary> /// <param name="p_hfile"></param> private unsafe void ReadFileInfo(IntPtr p_hfile) { IntPtr my_hfile = new IntPtr(-1); int hCurProcess = -1; //WinApi.GetCurrentProcess(); bool result; result = WinApi.DuplicateHandle(processHandle.ToInt32(), p_hfile.ToInt32(), hCurProcess, ref my_hfile, 0x80000000, false, 2); #region GetFileInformationByHandle 文件最基本信息 var fileinfo = new BY_HANDLE_FILE_INFORMATION(); result = WinApi.GetFileInformationByHandle(my_hfile.ToInt32(), ref fileinfo); //Console.Out.WriteLine(fileinfo.dwFileAttributes); #endregion #region GetFileInformationByHandleEx var fileinfo2 = new FILE_FULL_DIR_INFO(); int fileInfo2Type = (int)FileInformationClass.FileFullDirectoryInfo; //0xe; //本来想用开辟非托管内存的操作,传指针到winapi,后来发现那块内存有数据后用 //PtrToStructure转结构体报错,也许是操作问题,还不如直接传结构体 int size2 = Marshal.SizeOf(fileinfo2); IntPtr p_fileInfo2 = Marshal.AllocHGlobal(size2); Marshal.StructureToPtr(fileinfo2, p_fileInfo2, false); //调用失败 大概是LARGE_INTEGER 这个union的结构不对 result = WinApi.GetFileInformationByHandleEx(my_hfile.ToInt32(), fileInfo2Type, ref fileinfo2, size2); var fileinfo3 = new FILE_NAME_INFO(); //fileinfo3.FileName = ""; int fileInfo3Type = (int)FileInformationClass.FileNameInfo; //0x2; int size3 = Marshal.SizeOf(fileinfo3) + 1000 * 2; IntPtr p_fileInfo3 = Marshal.AllocHGlobal(size3); Marshal.StructureToPtr(fileinfo3, p_fileInfo3, false); //\otherproject\WriteFileHook\Log4netLoger\bin\x86\Debug\Logs\debug.log20170901 //result = WinApi.GetFileInformationByHandleEx(my_hfile.ToInt32(), fileInfo3Type, p_fileInfo3, size3); result = WinApi.GetFileInformationByHandleEx(my_hfile.ToInt32(), fileInfo3Type, ref fileinfo3, size3); StringBuilder fn3 = new StringBuilder(1000); int len3 = WinApi.GetFullPathName(fileinfo3.FileName, 1000, fn3, null); //输出正常路径 //E:\otherproject\WriteFileHook\Log4netLoger\bin\x86\Debug\Logs\debug.log20170901 Console.Out.WriteLine(fn3); #endregion #region GetFinalPathNameByHandle //char[] fileName = new char[1000]; StringBuilder fileName = new StringBuilder(1000); //获取的带设备路径 //\Device\HarddiskVolume4\otherproject\WriteFileHook\Log4netLoger\bin\x86\Debug\Logs\debug.log20170901 int size4 = WinApi.GetFinalPathNameByHandle(my_hfile.ToInt32(), fileName, 1000, 0x2); StringBuilder fn4 = new StringBuilder(1000); //会在前面在加个盘符,然而没去掉设备路径,超谐 //有专门根据设备路径获取盘符路径的方法 //E:\Device\HarddiskVolume4\otherproject\WriteFileHook\Log4netLoger\bin\x86\Debug\Logs\debug.log20170901 int len4 = WinApi.GetFullPathName(fileName.ToString(), 1000, fn4, null); Console.Out.WriteLine(fn4); #endregion #region ZwQueryInformationFile //GetFileInformationByHandleEx 内部调用的就是这个吧( var fileStatus5 = new IO_STATUS_BLOCK(); int ssize5 = Marshal.SizeOf(fileStatus5); IntPtr p_fileStatus5 = Marshal.AllocHGlobal(ssize5); Marshal.StructureToPtr(fileStatus5, p_fileStatus5, false); var fileinfo5 = new FILE_NAME_INFO(); //fileinfo5.FileName = ""; int fileInfo5Type = (int)FileInformationClass.FileFullDirectoryInfo; //9; int size5 = Marshal.SizeOf(fileinfo5) + 1000 * 2; IntPtr p_fileInfo5 = Marshal.AllocHGlobal(size5); Marshal.StructureToPtr(fileinfo5, p_fileInfo5, false); int ret = WinApi.ZwQueryInformationFile(my_hfile.ToInt32(), ref fileStatus5, ref fileinfo5, size5, fileInfo5Type); //\otherproject\WriteFileHook\Log4netLoger\bin\x86\Debug\Logs\debug.log20170901 Console.Out.WriteLine(fileinfo5.FileName); #endregion }
private static extern bool GetFileInformationByHandle(SafeFileHandle hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
public static extern bool GetFileInformationByHandle(IntPtr handle, ref BY_HANDLE_FILE_INFORMATION hfi);
internal static unsafe partial bool GetFileInformationByHandle(SafeFileHandle hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
GetFileInformationByHandle( IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
public static extern bool GetFileInformationByHandle( [In] SafeFileHandle hFile, [Out] out BY_HANDLE_FILE_INFORMATION lpFileInformation );
public bool FileEquals(BY_HANDLE_FILE_INFORMATION f) { return(FileIndexHigh == f.FileIndexHigh && FileIndexLow == f.FileIndexLow && VolumeSerialNumber == f.VolumeSerialNumber); }
public static extern bool GetFileInformationByHandle([System.Runtime.InteropServices.InAttribute()] System.IntPtr hFile, [System.Runtime.InteropServices.OutAttribute()] out BY_HANDLE_FILE_INFORMATION lpFileInformation);
public uint GetFileSystemId(FileInfo file) { BY_HANDLE_FILE_INFORMATION objectFileInfo = new BY_HANDLE_FILE_INFORMATION(); try { using (FileStream fs = file.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { GetFileInformationByHandle(fs.SafeFileHandle.DangerousGetHandle(), out objectFileInfo); } } catch (Exception) { return 0; } uint fileIndex = (objectFileInfo.FileIndexHigh << 32) + objectFileInfo.FileIndexLow; return fileIndex; }
public static extern bool GetFileInformationByHandle(IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
private static extern Boolean GetFileInformationByHandle( IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
public uint Def_GetFileInformation(string filename, ref BY_HANDLE_FILE_INFORMATION Information, IntPtr info) { return(0); }
internal static extern bool GetFileInformationByHandle ( IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation );
public static extern bool GetFileInformationByHandle( Microsoft.Win32.SafeHandles.SafeFileHandle hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation );
public static extern unsafe bool GetFileInformationByHandle(int hFile, ref BY_HANDLE_FILE_INFORMATION lpFileInformation);
public static bool CompareFile(BY_HANDLE_FILE_INFORMATION f1, BY_HANDLE_FILE_INFORMATION f2) { return(f1.dwVolumeSerialNumber == f2.dwVolumeSerialNumber && f1.nFileIndexHigh == f2.nFileIndexHigh && f1.nFileIndexLow == f2.nFileIndexLow); }
static extern bool GetFileInformationByHandle(SafeFileHandle hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
/// <summary></summary> public static bool GetFileInformationByHandle(IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation) => GetFileInformationByHandle_(hFile, out lpFileInformation);