【问题标题】:What means tilde in windows file patternwindows文件模式中的波浪号是什么意思
【发布时间】:2023-12-12 10:36:01
【问题描述】:

我有要搜索的模式。说“*.txt”。

现在我有一些我不想在那里列出的文件。我相信他们不符合这种模式。 但在 Windows 上,它们确实如此。

我知道波浪号用于制作旧版 8.3 文件名的短格式。也就是说 LongFilename.json 可能是 LONGFI~1.JSO。但我不知道它们是在文件搜索模式中的 Windows 上以某种方式处理的。他们是。我找不到任何关于它们的含义以及如何以我的方式匹配文件的文档。

我的问题不在于简短的表格。或者我认为它与它没有直接关系。

我有文件“A.txt”。现在我想要临时文件并使用“A.txt~”。它是通常不可见的 unix 备份文件。但在 Windows 上,它们本身不应该有特殊含义。仅适用于我的应用程序。

现在我想要“*.txt”文件列表。命令 目录 *.txt 令我惊讶的是同一目录中的所有 .txt~ 文件。我不想要他们。我使用 Win32 API 中的 FindFileFirst。我在文档中没有找到任何关于波浪字符的信息。 FindFileFirst(".txt", handle) 还返回文件“A.txt~”。我可以使用一些标志来排除它们吗?我知道我可以做出特殊的条件,就像我对“。”所做的那样。和 ”..”。 ~ 运算符如何工作? A.txt~1 也匹配。波浪号之后的所有内容都被忽略了吗?是功能还是错误?

我正在 Windows 7 Professional 64 版上进行测试,如果这有什么改变的话。

【问题讨论】:

  • 我也见过这样的事情。就我而言,它与波浪号无关。以您的示例为例,我正在搜索“.txt”,但它匹配得好像我说的是“.txt*”。重命名您的文件,使其扩展名为“.txt1”,看看它是否仍然匹配。它可能不是关于波浪号,而是关于该函数如何执行匹配。
  • 哦!你当然是对的。我什至没有想到它可能是那样的。似乎我无法匹配以某些内容结尾的文件,因为末尾有隐含的 *。 A.txt1 真正匹配 dir *.txt :-(

标签: windows winapi glob tilde-expansion filepattern


【解决方案1】:

FindFirstFile 还包括出于遗留原因的短名称,因此模式 *.txt 将包括任何以 *.txt 结尾的 8.3 表示形式,其中包括 *.txtANYTHING ,而不仅仅是 ~ 字符(请参阅@987654327 @for 匹配的对象)。

您需要在 FindNext 枚举中进行过滤。

【讨论】:

  • 是的,看起来是这样。它仅适用于长度为 3 的后缀。*.html 与 *.html1 不匹配。但是 *.htm 确实匹配 *.html 和 *.html1。遗留文件处理的奇怪副作用。
【解决方案2】:

例如,如果您正在搜索 .txt 文件,您可以在 windows 中使用“kind:text”选项来排除 txt~ 和类似文件,因为它们不再是可识别的类型。

这适用于常规 Windows 搜索。我不是 100% 确定 API,但它也应该存在。

【讨论】:

  • 问题是我在应用程序中使用旧的 Win32,在那里我发现了问题。我应该在哪里输入“kind:text”?我不想使用文件资源管理器。
  • 这更像是一种 SQL 方法。此页面可能会有所帮助。我不是该主题的真正专家,但我想这值得一试。 msdn.microsoft.com/en-us/library/windows/desktop/…