C# 这个代码中的memPtr是什么?
我看到了这段代码,但我发现了一些混乱,所以plzz建议 这个代码中的memPtr是什么?当我运行该代码时,出现一个错误memPtr在当前上下文中不存在C# 这个代码中的memPtr是什么?,c#,filesystems,C#,Filesystems,我看到了这段代码,但我发现了一些混乱,所以plzz建议 这个代码中的memPtr是什么?当我运行该代码时,出现一个错误memPtr在当前上下文中不存在 public class WinAPI { [DllImport("ntdll.dll", SetLastError = true)] public static extern IntPtr NtQueryInformationFile(IntPtr fileHandle, ref IO_STATUS_BLOCK IoSta
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);
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 Test
{
public ulong ApproachA()
{
WinAPI.IO_STATUS_BLOCK iostatus=new WinAPI.IO_STATUS_BLOCK();
WinAPI._FILE_INTERNAL_INFORMATION objectIDInfo = new WinAPI._FILE_INTERNAL_INFORMATION();
int structSize = Marshal.SizeOf(objectIDInfo);
FileInfo fi=new FileInfo(@"C:\Temp\testfile.txt");
FileStream fs=fi.Open(FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
IntPtr res=WinAPI.NtQueryInformationFile(fs.Handle, ref iostatus, memPtr, (uint)structSize, WinAPI.FILE_INFORMATION_CLASS.FileInternalInformation);
objectIDInfo = (WinAPI._FILE_INTERNAL_INFORMATION)Marshal.PtrToStructure(memPtr, typeof(WinAPI._FILE_INTERNAL_INFORMATION));
fs.Close();
Marshal.FreeHGlobal(memPtr);
return objectIDInfo.IndexNumber;
}
public ulong ApproachB()
{
WinAPI.BY_HANDLE_FILE_INFORMATION objectFileInfo=new WinAPI.BY_HANDLE_FILE_INFORMATION();
FileInfo fi=new FileInfo(@"C:\Temp\testfile.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;
}
}
公共类WinAPI
{
[DllImport(“ntdll.dll”,SetLastError=true)]
公共静态外部IntPtr NtQueryInformationFile(IntPtr文件句柄、ref IO_STATUS_块IoStatusBlock、IntPtr pInfoBlock、uint长度、文件信息_类文件信息);
公共结构IO_状态_块
{
uint状态;
乌龙信息;
}
公共结构文件内部信息{
公共ulong指数编号;
}
//缩写后的值比显示的值多
公共枚举文件\u信息\u类
{
FileDirectoryInformation=1,//1
FileFullDirectoryInformation,//2
FileBothDirectoryInformation,//3
FileBasicInformation,//4
文件标准信息,//5
文件内部信息//6
}
[DllImport(“kernel32.dll”,SetLastError=true)]
公共静态外部bool GetFileInformationByHandle(IntPtr hFile,out BY_HANDLE_FILE_INFORMATION lpFileInformation);
公共结构的句柄文件信息
{
公共uint文件属性;
公共文件时间创建时间;
公共文件时间LastAccessTime;
公共文件时间LastWriteTime;
公共单位卷序号;
公共单元文件大小高;
公共uint文件;
公共uint链接数;
公共uint文件索引高;
公共uint FileIndexLow;
}
}
公开课考试
{
公共乌龙方法()
{
WinAPI.IO_STATUS_BLOCK iostatus=新的WinAPI.IO_STATUS_BLOCK();
WinAPI._FILE_INTERNAL_INFORMATION objectIDInfo=新的WinAPI._FILE_INTERNAL_INFORMATION();
int structSize=Marshal.SizeOf(objectIDInfo);
FileInfo fi=newfileinfo(@“C:\Temp\testfile.txt”);
FileStream fs=fi.Open(FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
IntPtr res=WinAPI.NtQueryInformationFile(fs.Handle,ref iostatus,memPtr,(uint)structSize,WinAPI.FILE\u INFORMATION\u CLASS.FileInternalInformation);
objectIDInfo=(WinAPI.\u文件\内部\信息)Marshal.ptr结构(memPtr,typeof(WinAPI.\u文件\内部\信息));
fs.Close();
弗里赫全球元帅(memPtr);
返回objectindinfo.IndexNumber;
}
公共乌龙通道B()
{
WinAPI.BY_HANDLE_FILE_INFORMATION objectFileInfo=新的WinAPI.BY_HANDLE_FILE_INFORMATION();
FileInfo fi=newfileinfo(@“C:\Temp\testfile.txt”);
FileStream fs=fi.Open(FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
WinAPI.GetFileInformationByHandle(fs.Handle,out objectFileInfo);
fs.Close();
ulong fileIndex=((ulong)objectFileInfo.FileIndexHigh
第三个参数是指向您分配的缓冲区的指针,用于保存返回值。
在本例中,根据第5个参数的值,它是指向文件\内部\信息结构的指针
然后在下一行将其导入objectIDInfo。
第三个参数是指向您分配的缓冲区的指针,用于保存返回值。
在本例中,根据第5个参数的值,它是指向文件\内部\信息结构的指针
然后在下一行将其导入objectIDInfo。您需要类似的内容(未测试):
您需要这样的东西(未经测试):
但是我用什么来代替memPtr becaz这不在当前上下文中,但我用什么来代替memPtr becaz这不在当前上下文中
public ulong ApproachA()
{
WinAPI.IO_STATUS_BLOCK iostatus=new WinAPI.IO_STATUS_BLOCK();
// allocate space for _FILE_INTERNAL_INFORMATION
IntPtr memPtr =
Marshal.AllocHGlobal(Marshal.SizeOf(
typeof(WinAPI._FILE_INTERNAL_INFORMATION)));
// note the size
int structSize = Marshal.SizeOf(WinAPI._FILE_INTERNAL_INFORMATION);
FileInfo fi=new FileInfo(@"C:\Temp\testfile.txt");
FileStream fs = fi.Open(FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
// pass the address of the _FILE_INTERNAL_INFORMATION block
// and this function will fill it in
IntPtr res
= WinAPI.NtQueryInformationFile(fs.Handle, ref iostatus,
memPtr, (uint)structSize,
WinAPI.FILE_INFORMATION_CLASS.FileInternalInformation);
// dereference and cast it to the correct type
// so our managed code can get the data out of it
WinAPI._FILE_INTERNAL_INFORMATION objectIDInfo =
(WinAPI._FILE_INTERNAL_INFORMATION)Marshal.PtrToStructure(memPtr,
typeof(WinAPI._FILE_INTERNAL_INFORMATION));
fs.Close();
// make a local copy of just the thing we want
long IndexNumber = objectIDInfo.IndexNumber;
// free what we allocated
Marshal.FreeHGlobal(memPtr);
return IndexNumber;
}