繁体   English   中英

如何处理Windows的ReadDirectoryChangesW()及其混合长/短文件名输出?

[英]How to deal with Windows' ReadDirectoryChangesW() and its mixed long/short filename output?

我正在开发一段C代码,它使用ReadDirectoryChangesW()来监视Windows中目录下的更改。 我已经阅读了ReadDirectoryChangesW()和FILE_NOTIFY_INFORMATION结构的相关MSDN条目,以及其他几个文档。 此时,我已成功监控多个目录,监控本身没有明显问题。 问题是此函数放在FILE_NOTIFY_INFORMATION结构中的文件名不是规范的。

根据MSDN,它们可以是长形式也可以是短形式。 我发现了几个帖子,建议缓存短路径名和长路径名来处理这种情况。 不幸的是,根据我自己在Windows 7系统上的测试,这还不足以消除这个问题,因为每个文件名不只有两种选择。 问题是在路径名中,每个组件可以是长形式还是短形式。 以下路径名都可以引用同一个文件:

C:\\ PROGRA〜1 \\ MYPROG〜1 \\ MYDATA〜1.TXT

C:\\ PROGRA〜1 \\ MYPROG〜1 \\ MyDataFile.txt

C:\\ PROGRA〜1 \\ MyProgram \\ MYDATA〜1.TXT

C:\\ PROGRA〜1 \\ MyProgram \\ MyDataFile.txt

c:\\ Program Files \\ MYPROG~1 \\ MYDATA~1.TXT

...

从我使用cmd.exe的测试中我可以看出它们都是完全可以接受的。 实质上,每个文件的有效路径名数量随其路径名中的组件数量呈指数上升。

不幸的是,ReadDirectoryChangesW()似乎用提供给导致每个操作的系统调用的文件名填充其输出缓冲区。 例如,如果使用cmd.exe命令创建,重命名,删除等文件,则FILE_NOTIFY_INFORMATION将包含命令行中指定的文件名。

现在,在大多数情况下,我可以使用GetLongPathName()和朋友来获取我使用的唯一路径。 遗憾的是,删除文件时无法完成 - 当我收到通知时,文件已经消失,Get * PathName()函数将无法正常工作。

目前我正在考虑使用更广泛的缓存来确定应用程序为每个文件使用哪些备用路径名,这将处理任何情况,除了有人决定使用看不见的混合路径名突然删除文件的那个。 我正在考虑从父目录修改事件中创建数据挖掘,然后回到检查该情况的实际目录。

有什么建议可以更方便地做到这一点吗?

PS1:虽然Change Journals会有效地处理这个问题(我希望),但由于它们与NTFS的关系以及我的应用程序缺乏管理员权限,我不相信我可以使用它们。 除非我绝对被迫,否则我宁愿不去那里。

PS2:请记住,我主要在Unix上编码,所以要温柔......

您不需要缓存每个组合。 如果您缓存每个子路径以便能够将其转换为长格式,它将会执行此操作。 例如存储这个:

  • C:\\PROGRA~1 => c:\\Program Files
  • c:\\Program Files\\MYPROG~1 => c:\\Program Files\\MyProgram
  • c:\\Program Files\\MyProgram\\MYDATA~1.TXT => c:\\Program Files\\MyProgram\\MyDataFile.txt
  • c:\\Program Files\\MyProgram\\MYDATA~2.TXT => c:\\Program Files\\MyProgram\\MyDataFile2.txt

现在,如果您收到c:\\PROGRA~1\\MYPROG~1\\MYDATA~1.TXT ,请将其拆分为每个\\ ,然后查找每个部分的长形式。

不要忘记MyDataFile.txtMYDATAFILE.TXT也指向同一个文件。 因此,比较不区分大小写或将所有内容转换为大写。

如果c:\\PROGRA~1\\MYPROG~1\\MYDATA~1.TXT被删除,你仍然可以在c:\\PROGRA~1\\MYPROG~1上使用GetLongPathName()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM