2008-12-04 144 views
12

我碰到一個c庫,用於打開Unicode文件名的文件。在打開文件之前,它首先通過預先添加「\\?\」將文件名轉換爲路徑。根據this msdn article,是否有任何理由這樣做,而不是增加路徑中允許的最大字符數?在Windows上,何時應使用「\\?\」文件名前綴?

看起來像這些「\\?\」路徑需要Unicode API版本的Windows API和標準庫。

+0

除了長度限制之外,它還允許您不受限制地使用文件名中的句號和空格。例如,如果你想要的話,你可以有一個名爲`..`的文件, – Antimony 2013-04-24 22:05:07

回答

9

是的,它只是爲了這個目的。但是,如果您決定通過MAX_PATH長度創建路徑,則可能會遇到兼容性問題。例如,資源管理器shell和命令提示符(至少在XP上,我不知道Vista)無法處理超過該長度的路徑並返回錯誤。

1

我一直在寫Windows代碼自1995年以來,雖然我知道,前綴的,我從來沒有發現任何理由來使用它。據我所知,增加超過MAX_PATH的路徑長度似乎是它的唯一原因,而且我和我的任何程序的客戶都沒有這樣做過。

3

我認爲首先要注意的一點是,「\\?\」不會使路徑的UNC路徑。當你將其稱爲UNC-風格路徑時,第二次更準確。但即使如此,相似性只是從一開始就有兩個反斜槓。這與UNC無關。這是由於你必須使用甚至更​​多的字符來獲得帶有「\\?\」前綴的UNC路徑。

我認爲你已經有了使用該前綴的全部理由。它提升了您引用的文章中所述的最大長度限制。它只適用於Unicode路徑;非Unicode路徑不會通過使用該前綴來避免限制。

有一點需要注意的是,前綴不允許用於相對路徑,只適用於絕對路徑。您可能要仔細檢查一下,您的C庫是否能夠遵守該限制。

5

這種方法的最佳方式是可能不是創建新文件,但管理現有的文件,這可能已有其他人創建的。

我管理這經常會得到與path_length > MAX_PATH文件的文件服務器。你看,用戶看到這些文件爲H:\myfile.txt,但在服務器上它實際上是H:\users\username\myfile.txt。因此,如果用戶創建了一個與MAX_PATH字符完全相同的文件,則在服務器上它是MAX_PATH+len("users\username")。 (使用MAX_PATH字符創建文件並不少見,因爲當您在Internet Explorer上保存網頁時,它會使用頁面標題作爲文件名,這對於某些頁面來說可能很長)。

而且,共享驅動器(通過網絡或USB)與Mac或Linux機器,你可以用像CON,PRN或LPT1名的文件發現自己。再說一遍,前綴可以讓你和你的腳本處理這些文件。

+1

正確的是,它關閉了比長度檢查更多的處理。 (quote) 以最小的修改傳遞給系統,這意味着您不能使用正斜槓來表示路徑分隔符或表示當前目錄的句點,或者使用雙點來表示父目錄。由於您不能在相對路徑中使用「\\?\」前綴,因此相對路徑始終限制爲總共MAX_PATH個字符。 (/ quote) – 2009-12-09 00:24:02

3

除了允許更長的路徑,將「\\?\」前綴,您還可以使用文件和目錄的名稱,如「CON」和「輔助」。通常Windows會將這些解釋爲老式的DOS設備。

相關問題