2015-03-13 19 views
3

如果我創建一個包含「hello.txt的」,然後將下面的代碼將輸出「hello.txt的」目錄:在FindFirstFile調用中「<」是什麼意思?

#include <windows.h> 
#include <iostream> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    WIN32_FIND_DATA findData = {}; 
    HANDLE hFind = ::FindFirstFile(L"<.txt", &findData); 
    if (hFind != INVALID_HANDLE_VALUE) 
    { 
     std::wcout << findData.cFileName << std::endl; 
     while (::FindNextFile(hFind, &findData)) 
     { 
      std::wcout << findData.cFileName << std::endl; 
     } 
     ::CloseHandle(hFind); 
    } 
    else 
    { 
     std::wcout << "FindFirstFile: " << ::GetLastError() << std::endl; 
    } 
    return 0; 
} 

但爲什麼「<」呼叫像「*」來FindFirstFile

MSDN表示只有通配卡租船人在此通話中有效(即?或*)。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364418%28v=vs.85%29.aspx

編輯:

似乎是非常相關的FindFirstFile undocumented wildcard or bug?

+0

這是一個通配符。可能最好的地方是看到'<', '>'和'''通配符記錄(從內部的Windows Name.c源文件複製)是.NET Reference Source,[PatternMatcher.cs](http://referencesource.microsoft.com /#System/services/io/system/io/PatternMatcher.cs)源文件 – 2015-03-13 11:34:00

+0

因此,行爲與*不完全相同,因爲它表示「DOS_QM匹配任何單個字符,或遇到一段時間或結束名稱字符串,將表達式推進到連續DOS_QM集合的末尾。「 – paulm 2015-03-13 12:12:06

回答

7

<是在文件名無效字符。它是一個保留字符,如下所示:Naming Files, Paths, and Namespaces – Naming Conventions

我的猜測是FindFirstFile的實現只是將所有保留字符視爲通配符。也許這是一個向後兼容的原因。同樣,因爲<在這裏是正式無效的,並且由於行爲沒有記錄,所以不應該依賴它。

更新

感謝@eryksun在意見提供了一些低級別的細節。實際執行搜索的底層使用<>作爲通配符。在將搜索字符串傳遞到較低層之前,Win32層將*?轉換爲<>。這解釋了爲什麼*<可以從高級別互換。

+0

有趣的是,Microsoft Outlook正在這樣做 – paulm 2015-03-13 10:20:58

+0

它調用'NtQueryDirectoryFile',它必須在這裏實現DOS語義,因此文件系統運行時庫定義了'DOS_DOT'( 'L'「'''),'DOS_QM'('L'>'')和'DOS_STAR'('L'<'')。有關更多詳細信息,請參閱['FsRtlIsNameInExpression'](https://msdn.microsoft.com/en-us/library/windows/hardware/ff546850%28v=vs.85%29.aspx)。 – eryksun 2015-03-13 10:58:16

+0

我不建議人們使用這些字符而不是普通的DOS通配符。這僅僅是爲了讓任何人都好奇FindFirstFileEx是如何將DOS通配符轉換成NT域,並解釋爲什麼保留了'''',這對shell來說有特殊意義,這意味着它們可以用作NT通配符 – eryksun 2015-03-13 11:16:39