Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Win API NTFS OpenFileByID引发AccessViolationException异常_C#_Winapi_Visual Studio 2013_Ntfs_Interopservices - Fatal编程技术网

C# Win API NTFS OpenFileByID引发AccessViolationException异常

C# Win API NTFS OpenFileByID引发AccessViolationException异常,c#,winapi,visual-studio-2013,ntfs,interopservices,C#,Winapi,Visual Studio 2013,Ntfs,Interopservices,test()中的OpenFileByID行为我提供了System.AccessViolationException试图读取或写入受保护内存。这通常表示其他内存已损坏。 我正在尝试复制(请参见答案),这是我在Visual Studio Express 2013 for Windows Desktop中运行的。但这个例子似乎对我不起作用。它在test()中的OpenFileByID行中断 简而言之,我获取一个文件的ID,然后尝试从该ID创建一个文件句柄。稍后,我计划使用该句柄获取有关该文件的信息。我

test()中的OpenFileByID行为我提供了
System.AccessViolationException试图读取或写入受保护内存。这通常表示其他内存已损坏。

我正在尝试复制(请参见答案),这是我在Visual Studio Express 2013 for Windows Desktop中运行的。但这个例子似乎对我不起作用。它在test()中的OpenFileByID行中断

简而言之,我获取一个文件的ID,然后尝试从该ID创建一个文件句柄。稍后,我计划使用该句柄获取有关该文件的信息。我使用IDs的原因是,我可以修复断开的链接,因为目标文件的GUID比其假定位置可靠得多。谢谢你的帮助


编辑:我试图打开的文件是我桌面上的一个普通文本文件,没有什么特别之处。

您没有检查是否有有效的卷句柄-您可能没有。可能是你a/v的来源

当您打开根目录时,文档说您不应该将FILE\u ATTRIBUTE\u NORMAL与任何其他标志一起使用,但您使用的是FILE\u FLAG\u BACKUP\u语义。要使用文件\标志\备份\语义,您必须获得SE\ U备份\名称的权限。您必须是管理员或备份操作员才能这样做。我无法想象你需要那面旗帜

您可以通过打开“\\.\C:”(例如)…来获取卷句柄,该句柄与根文件夹的句柄不同。我通常使用GenericRead打开它,但如果您只需要OpenFileById,则可以指定0进行访问

另外-不需要向文件添加对象ID-文件引用号(FRN)是文件的主文件表标识符-它是可以在文件ID描述符中传递的“其他”类型的ID。您可以从一个打开的文件句柄调用中获得它-它是nFileindexHigh和nFileIndexLow,被转换为长整型。当您移动一个文件时,FRN保持不变(只有其父FRN更改)。此外,重命名文件时,FRN不会更改。使用此over ObjectID的好处是,您不需要为了跟踪文件而更改卷……而且不必使用DeviceIOControl—这有点像互操作的噩梦


还有一个想法——OpenFileByID直到Vista和WindowsServer2008才出现。你在那里,对吗?

你似乎忽略了发布任何代码。代码在链接中。我尝试在这里发布它,但是它抱怨身体太大了。先得到一个C++中简单的例子,只有这样才好,担心编写C ppUnKek声明,在C语言中得到同样的简单情况,最后你准备集成到一个更大的程序中。我希望C是因为它对数据库有更好的支持,但我开始同意,准备在白宫中升起白旗,然后用C++来做。code>int-lpSecurityAttributes可能应该是
IntPtr
。其余的参数也有不寻常的类型。至少应添加适当的
marshallas
属性。