-1

test() 中的 OpenFileByID 行给了我System.AccessViolationException Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

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

简而言之,我正在获取一个文件的 ID,然后尝试从该 ID 创建一个文件句柄。稍后我计划使用该句柄来获取有关文件的信息。我使用 ID 的原因是我可以修复损坏的链接,因为目标文件的 GUID 比它的假定位置可靠得多。帮助表示赞赏!

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

4

1 回答 1

0

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

当您打开根目录时,文档说您不应将 FILE_ATTRIBUTE_NORMAL 与任何其他标志一起使用 - 但您将其与 FILE_FLAG_BACKUP_SEMANTICS 一起使用。要使用 FILE_FLAG_BACKUP_SEMANTICS,您必须获得 SE_BACKUP_NAME 的权限。您必须是管理员或备份操作员才能执行此操作。我无法想象你需要那面旗帜。

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

此外 - 不需要向文件添加对象 ID - 文件参考号 (FRN) 是文件的主文件表标识符 - 它是您可以在 FILE_ID_DESCRIPTOR 中传递的“其他”类型的 ID。您可以从调用GetFileInformationByHandle的打开文件句柄中获取它- 它是将 nFileindexHigh 和 nFileIndexLow 制成长整数。当您移动文件时,FRN 会保留(只有它的父 FRN 会更改)。此外,当您重命名文件时,FRN 不会更改。在 ObjectID 上使用它的好处是,您不会为了跟踪文件而更改音量……而且您不必使用 DeviceIOControl - 这有点像互操作的噩梦。

再想一想——OpenFileByID 直到 Vista 和 Windows Server 2008 才出现。你在那里,对吧?

于 2015-04-11T12:45:14.767 回答