我只是在这里阅读此帖子,想知道是否可以从该ID中获取当前的文件路径。
那么,如果移动文件,我可以通过搜索该ID来获取新的文件路径吗?不幸的是,我找不到有关此主题的任何信息。
或ID仅用于识别文件并且不能用于跟踪位置?
预先感谢。
//添加代码
public class WinAPI
{
[DllImport("ntdll.dll", SetLastError = true)]
public static extern IntPtr NtQueryInformationFile(IntPtr fileHandle, ref IO_STATUS_BLOCK IoStatusBlock, IntPtr pInfoBlock, uint length, FILE_INFORMATION_CLASS fileInformation);
public struct IO_STATUS_BLOCK
{
uint status;
ulong information;
}
public struct _FILE_INTERNAL_INFORMATION
{
public ulong IndexNumber;
}
// Abbreviated, there are more values than shown
public enum FILE_INFORMATION_CLASS
{
FileDirectoryInformation = 1, // 1
FileFullDirectoryInformation, // 2
FileBothDirectoryInformation, // 3
FileBasicInformation, // 4
FileStandardInformation, // 5
FileInternalInformation // 6
}
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetFileInformationByHandle(IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr OpenFileById(IntPtr hFile, FILE_ID_DESCRIPTOR lpFileID, uint dwDesiredAccess, uint dwShareMode, uint dwFlagas);
[StructLayout(LayoutKind.Explicit)]
public struct FILE_ID_DESCRIPTOR
{
[FieldOffset(0)] public uint dwSize;
[FieldOffset(4)] public FILE_ID_TYPE type;
// [FieldOffset(8)] public Guid guid;
[FieldOffset(8)] public long FileReferenceNumber;
}
public enum FILE_ID_TYPE
{
FileIdType = 0,
ObjectIdType = 1,
ExtendedFileIdType = 2,
MaximumFileIdType
};
public struct BY_HANDLE_FILE_INFORMATION
{
public uint FileAttributes;
public FILETIME CreationTime;
public FILETIME LastAccessTime;
public FILETIME LastWriteTime;
public uint VolumeSerialNumber;
public uint FileSizeHigh;
public uint FileSizeLow;
public uint NumberOfLinks;
public uint FileIndexHigh;
public uint FileIndexLow;
}
}
public class File_Handle
{
public ulong Get_Index()
{
WinAPI.BY_HANDLE_FILE_INFORMATION objectFileInfo = new WinAPI.BY_HANDLE_FILE_INFORMATION();
FileInfo fi = new FileInfo(@"D:TestTestfile.txt");
FileStream fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
WinAPI.GetFileInformationByHandle(fs.Handle, out objectFileInfo);
fs.Close();
ulong fileIndex = ((ulong)objectFileInfo.FileIndexHigh << 32) + (ulong)objectFileInfo.FileIndexLow;
return fileIndex;
}
public string Retrieve_File(ulong Index)
{
// WinAPI.BY_HANDLE_FILE_INFORMATION objectFileInfo = new WinAPI.BY_HANDLE_FILE_INFORMATION();
// WinAPI.FILE_ID_DESCRIPTOR Descriptor = new WinAPI.FILE_ID_DESCRIPTOR { dwSize = sizeof(uint) + sizeof(WinAPI.FILE_ID_TYPE) + sizeof(long), type = WinAPI.FILE_ID_TYPE.FileIdType, FileReferenceNumber = (long)Index };
WinAPI.FILE_ID_DESCRIPTOR Descriptor = new WinAPI.FILE_ID_DESCRIPTOR { dwSize = 100, type = WinAPI.FILE_ID_TYPE.FileIdType, FileReferenceNumber = (long)Index };
FileInfo fi = new FileInfo(@"D:TestTestfileRef.txt");
FileStream fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
//FileStream wf = new FileStream(WinAPI.OpenFileById(fs.Handle, Descriptor, 0, 4, 0x08000000), FileAccess.ReadWrite);
FileStream wf = new FileStream(WinAPI.OpenFileById(fs.Handle, Descriptor, 0, 0, 0x08000000), FileAccess.ReadWrite);
WinAPI.BY_HANDLE_FILE_INFORMATION objectFileInfo = new WinAPI.BY_HANDLE_FILE_INFORMATION();
WinAPI.GetFileInformationByHandle(wf.Handle, out objectFileInfo);
fs.Close();
wf.Close();
return "Dummy";
}
}
由于硬链接,文件可以具有多个路径。只要有人在文件上有开放的手柄,就可以保证文件ID稳定,但实际上它们在NTF上总是稳定的。碎片部可以改变fat32上的ID。
您可以尝试GetFileInformationByHandleEx
,但结果可能会根据Windows版本和文件系统而有所不同。