ความยาวชื่อไฟล์สูงสุดใน NTFS (Windows XP และ Windows Vista)?


261

ฉันกำลังออกแบบตารางฐานข้อมูลซึ่งจะเก็บชื่อไฟล์ของไฟล์ที่อัปโหลด ความยาวสูงสุดของชื่อไฟล์ใน NTFS ที่ใช้โดย Windows XP หรือ Vista คือเท่าใด


83
ฉันไม่เคยเห็นคำตอบที่แตกต่างมากมายกับสิ่งที่ควรเป็นคำถามง่ายๆ 199, 255, 256, 257, 260, 'ประมาณ 30 000', 'ประมาณ 32,000' และ 'มันขึ้นอยู่กับ' แน่นอนว่ามีผู้คัดเลือก แต่สิ่งเหล่านี้ไม่ถูกต้องใช่ไหม
ไม่มีเงื่อนไข ReinstateMonica

7
255 ของมันฉันรู้สิ่งนี้เพราะฉันต้องสร้างแอปพลิเคชันเพื่อป้องกันไม่ให้ผู้ใช้องค์กรเข้าถึงสิ่งนี้เพราะมันทำให้เกิดปัญหากับเซิร์ฟเวอร์จัดเก็บข้อมูลของเรา
RobertPitt

2
@RobertPitt คุณกำลังพลาดบางสิ่งในนั้น อ้างอิงจาก MSDN: "ความยาวสูงสุดสำหรับเส้นทางคือ MAX_PATH ซึ่งกำหนดเป็น 260 ตัวอักษร"
Michael Olesen

7
@ Michael9000 ฉันเชื่อว่า RobertPitt กำลังพูดถึงขีด จำกัด ของชื่อไฟล์ (ซึ่งเป็นสิ่งที่คำถามนี้เกี่ยวกับ) ไม่ใช่ขีด จำกัด ของเส้นทาง
gdw2

7
NTFS ไม่ จำกัด MAX_PATH เลยเชลล์ Windows ถูก จำกัด ไว้ที่ MAX_PATH ความยาวพา ธ สูงสุดของ NTFS คือ 32k
paulm

คำตอบ:


286

ส่วนประกอบแต่ละส่วนของชื่อไฟล์ (เช่นแต่ละไดเรกทอรีย่อยตามเส้นทางและชื่อไฟล์สุดท้าย) ถูก จำกัด ที่ 255 อักขระและความยาวพา ธ ทั้งหมดจะถูก จำกัด ที่ประมาณ 32,000 ตัวอักษร

อย่างไรก็ตามใน Windows คุณต้องมีMAX_PATHค่าไม่เกิน(259 ตัวอักษรสำหรับไฟล์, 248 สำหรับโฟลเดอร์) ดูhttp://msdn.microsoft.com/en-us/library/aa365247.aspxสำหรับรายละเอียดทั้งหมด


4
นี่คือข้อเท็จจริงบางอย่างเพิ่มเติมที่ยืนยันคำตอบนี้ (โดยปกติ Windows จำกัด ไว้ที่ 260 ตัวอักษร): msdn.microsoft.com/en-us/library/ …และblogs.msdn.com/b/bclteam/archive/2007/02/13 / …
Michael Olesen

62
ถูกต้องสำหรับ NTFS ไม่ถูกต้องสำหรับ Windows ตามลิงค์ที่คุณระบุ: "ใน Windows API (มีข้อยกเว้นบางอย่างที่กล่าวถึงในย่อหน้าต่อไปนี้) ความยาวสูงสุดสำหรับพา ธ คือ MAX_PATH ซึ่งกำหนดเป็น 260 ตัวอักษร" รวมเส้นทางเพื่อวัตถุประสงค์ในทางปฏิบัติทุก จำกัด 259 ตัวอักษร (เพื่อให้สามารถโมฆะ-Terminator)
Lawrence Dol

9
เห็นได้ชัดว่าหากคุณใช้ "unicode version" ของวิธีการไฟล์ Windows API คุณสามารถเพิ่มได้ถึง 32767 หากคุณใส่คำนำหน้าชื่อพา ธ ด้วย "\\? \" ใช่ไหม
rogerdpack

6
@rogerdpack: สำหรับเส้นทางแบบเต็มใช่ แต่แต่ละองค์ประกอบ (โฟลเดอร์ย่อย / ไฟล์สุดท้าย) แต่ละไฟล์มีขีด จำกัด 255 จุดรหัส utf-16 นอกจากนี้ซอฟต์แวร์ปกติคาดหวัง MAX_PATH ดังนั้น ... boom :)
snemarch

5
ใน Windows 10 (รุ่น 1607 - อัพเดตครบรอบ) และ Windows Server 2016 คุณมีตัวเลือกที่จะเพิกเฉยต่อปัญหา MAX_PATH โดยการแทนที่รายการนโยบายกลุ่มเปิดใช้งานเส้นทางยาว NTFS ภายใต้การกำหนดค่าคอมพิวเตอร์ -> เทมเพลตผู้ดูแลระบบ -> ระบบ -> FileSystem:
Steven Mark Ford

28

มันคือ 257 ตัวอักษร ความแม่นยำ: NTFS นั้นกำหนดความยาวชื่อไฟล์สูงสุดหลายพันตัวอักษร (ประมาณ 30'000 อย่าง) อย่างไรก็ตาม Windows จะกำหนดความยาวสูงสุด 260 ชื่อสำหรับเส้นทาง + ชื่อไฟล์ โฟลเดอร์ drive + มีความยาวอย่างน้อย 3 ตัวอักษรดังนั้นคุณจึงมี 257


21
ผิด - ตัวสิ้นสุด NUL เป็นส่วนหนึ่งของ MAX_PATH ซึ่งทำให้คุณมีเส้นทางสูงสุด 256 ตัวอักษร (ซึ่งคุณจะไม่สามารถสร้างได้เนื่องจากขีด จำกัด ของแต่ละองค์ประกอบของ 255)
snemarch

4
"ซึ่งคุณจะไม่สามารถสร้างได้เนื่องจากข้อ จำกัด ของแต่ละองค์ประกอบของ 255" ผิด เรากำลังพูดถึงที่นี่เกี่ยวกับความยาวพา ธ สูงสุดไม่ใช่ความยาวส่วนประกอบพา ธ สูงสุดแต่ละรายการ ยิ่งกว่านั้น "เมื่อใช้ API เพื่อสร้างไดเรกทอรีเส้นทางที่ระบุต้องไม่ยาวจนคุณไม่สามารถผนวกชื่อไฟล์ 8.3 (นั่นคือชื่อไดเรกทอรีต้องไม่เกิน MAX_PATH ลบ 12)"
Ludovic Kuty

การถกเถียงครั้งนี้เกิดขึ้นเพียงเพราะ api ระดับต่ำอนุญาตให้สร้างชื่อไฟล์ 256 ตัวอักษรโดยสมมติว่า 256 char เป็นโมฆะ แต่ไฟล์นั้นไม่สามารถเข้าถึงได้ (ซ่อนอยู่) กับแอปพลิเคชั่นดั้งเดิม
Conrad B

1
@ LudovicKuty: OP จริง ๆกำลังพูดถึงข้อ จำกัดความยาวชื่อไฟล์ไม่ใช่ความยาวพา ธ (ใช่แม้ในการแก้ไขครั้งแรกฉันตรวจสอบแล้ว) และเขา / ดิฉันอ้างถึงข้อ จำกัด NTFS เป็นพิเศษและไม่ จำกัด ระบบปฏิบัติการระบบย่อยหรือ API หรือเฟรมเวิร์คโดยเฉพาะ
0xC0000022L

@ 0xC0000022L ใช่แล้ว ฉันอ่านผิดในคำถาม OP และมุ่งเน้นไปที่ความคิดเห็นที่พูดถึงความยาวชื่อไฟล์และความยาวเส้นทาง
Ludovic Kuty

27

นี่คือสิ่งที่ "Unhandled exception" พูดในกรอบ 4.5 เมื่อพยายามบันทึกไฟล์ด้วยชื่อไฟล์แบบยาว:

พา ธ ชื่อไฟล์หรือทั้งสองที่ระบุยาวเกินไป ชื่อไฟล์แบบเต็มต้องน้อยกว่า260อักขระและชื่อไดเรกทอรีต้องน้อยกว่า248ตัวอักษร

ภาพหน้าจอ


16

199 บน Windows XP NTFS ฉันเพิ่งตรวจสอบ

นี่ไม่ใช่ทฤษฎี แต่จากการลองบนแล็ปท็อปของฉัน อาจมีผลกระทบบรรเทา แต่มันจะไม่ทำให้ฉันใหญ่ขึ้น

มีการตั้งค่าอื่น ๆ ที่ จำกัด สิ่งนี้ฉันสงสัย? ลองด้วยตัวคุณเอง


1
ยืนยันสิ่งนี้ในเวอร์ชั่น XP ของฉันมันช่างเจ็บปวด
เหลือเกิน

ฉันทำเช่นเดียวกันใน Windows XP เพียงเพื่อหัวเราะคิกคัก ฉันขีด จำกัด ที่ 200 ตัวอักษร จากนั้นฉันเพิ่งสร้างไฟล์ที่มี 255 ครั้งwลบออกและสร้างโฟลเดอร์ที่มีชื่อเดียวกันใน Windows 7 x64 ตอนนี้คำถามคืออะไรคือปัจจัย จำกัด ที่นี่: รุ่น NTFS, ระบบปฏิบัติการหรือระบบย่อยหรือ Win32 API ใน XP?
0xC0000022L

ดูเหมือนจะมีขีด จำกัด 200 ตัวอักษรอยู่ในตัวสำรวจ โปรแกรมอื่น ๆ สามารถสร้างชื่อไฟล์ได้อีกต่อไป นี่อาจเป็นข้อ จำกัด โดยเจตนาในการบันทึกผู้ใช้จากเขา / เธอด้วยตนเอง :-)
avl_sweden

13

ตามMSDNมี 260 ตัวอักษร มันรวมถึง"<NUL>" - ตัวอักษรยกเลิกสิ้นสุดที่มองไม่เห็นดังนั้นความยาวจริงคือ 259

แต่อ่านบทความมันซับซ้อนกว่าเล็กน้อย


1
ที่จริงแล้วบทความ MSDN ที่อ้างถึงบอกว่าเส้นทางนั้น จำกัด ไว้ที่ 260 ตัวอักษร แต่ความยาวของชื่อไฟล์นั้นขึ้นอยู่กับระบบไฟล์ (แต่โดยทั่วไปแล้ว 255 ไบต์) อย่างไรก็ตามเป็นไปได้ที่จะใช้ "Unicode version [ของฟังก์ชั่น Windows API]" เพื่อเพิ่มขีด จำกัด พา ธ เป็น 32767 ไบต์ แต่ข้อ จำกัด นั้นจะลดลงโดย windows จะขยายส่วน\\?\ นำหน้าที่ต้องการภายในระยะเวลาที่กำหนดให้เป็นความยาวที่ไม่ระบุ พา ธ ต้องอยู่ภายใต้ 32767 ไบต์หลังจากส่วนขยายนี้
Mikko Rantalainen

13

ความยาวใน NTFS คือ 255 NameLengthฟิลด์ใน NTFS$Filenameแอตทริบิวต์เป็นไบต์ที่ไม่มีการชดเชย ค่านี้ให้ช่วงของ 0-255

ชื่อไฟล์ iself สามารถอยู่ใน "namespaces" ที่แตกต่างกัน จนถึงตอนนี้มี: POSIX, WIN32, DOS และ (WIN32DOS - เมื่อชื่อไฟล์สามารถเป็นชื่อ DOS ได้) (เนื่องจากสตริงมีความยาวจึงอาจมี \ 0 แต่จะทำให้เกิดปัญหาและไม่ได้อยู่ในเนมสเปซข้างต้น)

ดังนั้นชื่อของไฟล์หรือไดเรกทอรีสามารถยาวได้ถึง 255 ตัวอักษร เมื่อระบุเส้นทางแบบเต็มภายใต้ Windows คุณจะต้องใส่คำนำหน้าเส้นทางด้วย\\? \ (หรือใช้ \\? \ UNC \ server \ share สำหรับเส้นทาง UNC)เพื่อทำเครื่องหมายเส้นทางนี้เป็นความยาวเสริม (~ 32k ตัวอักษร) . หากเส้นทางของคุณยาวขึ้นคุณจะต้องตั้งไดเรกทอรีทำงานของคุณไปพร้อมกัน (เอฟเฟกต์ข้างเคียงเนื่องจากการตั้งค่าทั้งกระบวนการ)




4

ฉันกำลังเพิ่มสิ่งนี้ลงในคำตอบที่ได้รับการอนุมัติข้างต้น

เหตุผลที่คนเชื่อว่ามีความยาว 255-260 ตัวอักษรเป็นเพราะนั่นคือทั้งหมดที่ Windows Explorer รองรับ มันจะเกิดข้อผิดพลาดในการทำบางสิ่งเช่นสำเนาไฟล์ในชื่อไฟล์ที่ยาวกว่านั้น อย่างไรก็ตามโปรแกรมสามารถอ่านและเขียนชื่อไฟล์ได้นานขึ้น (ซึ่งเป็นวิธีที่คุณได้รับความยาวที่ Explorer บ่นในตอนแรก) Microsoft "แนะนำแก้ไข" ในสถานการณ์เช่นนี้คือการเปิดไฟล์ในโปรแกรมต้นฉบับที่เขียนและเปลี่ยนชื่อ


ฉันพยายามบันทึกไฟล์ลงในลำดับชั้นของโฟลเดอร์อย่างแน่นอนมากกว่า 260+ ตัวอักษรจากบรรทัดคำสั่งด้วยเสียงเรียกเข้า แต่ไม่สำเร็จ
panny

@panny: ดังนั้นผู้เขียนเป็นกลุ่มจึงไม่ได้ดูแลที่จะใช้ชื่อเส้นทางยาวแล้ว นั่นไม่ใช่ Windows ที่จะตำหนิหรือระบบย่อย Win32 และไม่มีส่วนเกี่ยวข้องกับการจำกัดความยาวชื่อไฟล์สำหรับ NTFS ที่ OP ถาม
0xC0000022L

3

ตามเอกสารของ Windows SDK ใหม่ (8.0) ดูเหมือนว่าจะมีการ จำกัด เส้นทางใหม่ มีชุดการจัดการเส้นทางใหม่และนิยามของ PATHCCH_MAX_CCH ดังนี้:

// max # of characters we support using the "\\?\" syntax
// (0x7FFF + 1 for NULL terminator)
#define PATHCCH_MAX_CCH             0x8000

3
อย่างไรก็ตาม Windows 8 explorer (ตัวอย่าง Win8.1 ในกรณีของฉัน) ไม่ทำงานกับขีด จำกัด นี้และจะไม่ยอมรับเส้นทางที่ยาวเกิน 259 ตัวอักษร
Cplusminus_is_coming

3

ส่วนนี้ของเอกสารอย่างเป็นทางการกล่าวอย่างชัดเจนว่าเป็น255 Unicode อักขระสำหรับ NTFS, exFAT และ FAT32 และ 127 Unicode หรือ 254 ASCII อักขระสำหรับ UDF

นอกจากนั้นความยาวชื่อพา ธ สูงสุดคือ 32,760 อักขระ Unicode เสมอโดยแต่ละองค์ประกอบของพา ธ ไม่เกิน 255 อักขระ


ใกล้พอ ในขณะที่ฉันชี้ให้เห็นในความคิดเห็นเกี่ยวกับคำตอบที่ยอมรับมันเป็นWCHARองค์ประกอบ32767 ไม่ไม่ใช่ "ตัวอักษร Unicode" (ตรวจสอบคำศัพท์ Unicode ของคุณ: จุดรหัสตัวอักษร ฯลฯ ... !)
0xC0000022L

2

255 ตัวอักษรแม้ว่าเส้นทางที่สมบูรณ์จะต้องไม่ยาวกว่านั้นเช่นกัน มีตารางที่ดีมากกว่าที่วิกิพีเดียเกี่ยวกับเรื่องนี้: http://en.wikipedia.org/wiki/Filename


-2

238! ฉันตรวจสอบภายใต้ Win7 32 บิตด้วยสคริปต์ค้างคาวต่อไปนี้:

set "fname="
for /l %%i in (1, 1, 27) do @call :setname
@echo %fname%
for /l %%i in (1, 1, 100) do @call :check
goto :EOF
:setname
set "fname=%fname%_123456789"
goto :EOF
:check
set "fname=%fname:~0,-1%"
@echo xx>%fname%
if not exist %fname% goto :eof
dir /b
pause
goto :EOF

ฉันตรวจสอบภายใต้ Windows 7 ด้วยโปรแกรมที่จัดการเส้นทางยาวอย่างถูกต้อง แต่ละเซกเมนต์ของเส้นทางแต่ละอันอาจใช้เวลา 255 อักขระ (ฉันใช้w) แล้วตอนนี้ล่ะ?
0xC0000022L

-2

จริงๆแล้วมันเป็น 256 เห็นFile System ฟังก์ชั่นการเปรียบเทียบขีด จำกัด

หากต้องการโพสต์ซ้ำบนhttp://fixunix.com/microsoft-windows/30758-windows-xp-file-name-length-limit.html

"สมมติว่าเรากำลังพูดถึง NTFS และไม่ใช่ FAT32," 255 ตัวอักษรสำหรับพา ธ + ไฟล์ "เป็นข้อ จำกัด ของ Explorer ไม่ใช่ระบบไฟล์ตัวเอง NTFS รองรับพา ธ สูงสุด 32,000 ตัวอักษร Unicode โดยแต่ละคอมโพเนนต์มีความยาว 255 อักขระ

Explorer - และ Windows API- จำกัด คุณไว้ที่ 260 ตัวอักษรสำหรับพา ธ ซึ่งรวมถึงตัวอักษรชื่อไดรฟ์เครื่องหมายโคลอนการแยกเครื่องหมายทับและอักขระ null ที่สิ้นสุด เป็นไปได้ที่จะอ่านเส้นทางที่ยาวขึ้นใน Windows หากคุณเริ่มต้นด้วย\\"

หากคุณอ่านข้อความข้างต้นคุณจะเห็นว่ามีสิ่งที่ 5 ที่คุณมั่นใจได้: ค้นหาผู้ใช้คอมพิวเตอร์อย่างน้อยหนึ่งคนที่ดื้อรั้น!


4
ไม่ใช่ - มันคือ 255 ฟิลด์ NameLength ในแอตทริบิวต์ชื่อไฟล์ NTFS $ เป็นไบต์ที่ไม่มีออฟเซ็ต สิ่งนี้ให้ช่วงของ 0-255
Dominik Weber

-2

ฉันไม่สามารถสร้างไฟล์ที่มีชื่อ + period + extnesion ใน WS 2012 Explorer นานกว่า224อักขระ อย่ายิงผู้ส่งสาร!

ใน CMD ของเซิร์ฟเวอร์เดียวกันฉันไม่สามารถสร้างชื่ออักขระยาวกว่า235ตัว:

ระบบไม่สามารถหาเส้นทางที่ระบุ.

ไฟล์ที่มีชื่อตัวละคร 224 ตัวที่สร้างขึ้นใน Explorer ไม่สามารถเปิดได้ใน Notepad ++ มันเพิ่งมาพร้อมกับไฟล์ใหม่แทน


The system cannot find the path specified.The specified path, file name, or both are too long.ไม่ได้เป็นเช่นเดียวกับ ฉันเดาว่าคุณพิมพ์ผิดหรือบางอย่าง คุณได้รับข้อความนั้นหากคุณพยายามสร้างไฟล์ในเส้นทางที่ไม่มีอยู่หรือถ้าคุณต้องการย้ายไปยังทิศทางที่ไม่มีอยู่
Matthias Burger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.