อักขระที่อนุญาตในชื่อไฟล์ [ปิด]


145

ฉันจะค้นหารายการอักขระที่อนุญาตในชื่อไฟล์ได้ที่ไหนทั้งนี้ขึ้นอยู่กับระบบปฏิบัติการ (เช่นบน Linux :อนุญาตให้ใช้อักขระในชื่อไฟล์ แต่ไม่สามารถใช้กับ Windows ได้)


.NET ให้ข้อมูลดังกล่าวสำหรับ Windows
leppie


9
@kreker ทราบว่าคำถามของคุณเกี่ยวกับ Android
Congusbongus


คำตอบ:


115

คุณควรเริ่มต้นด้วยหน้าชื่อไฟล์ Wikipedia มีตารางขนาดพอเหมาะ ( การเปรียบเทียบข้อ จำกัด ของชื่อไฟล์ ) แสดงรายการอักขระที่สงวนไว้สำหรับระบบไฟล์จำนวนมาก

นอกจากนี้ยังมีข้อมูลอื่น ๆมากมายเกี่ยวกับระบบไฟล์แต่ละระบบรวมถึงชื่อไฟล์ที่สงวนไว้เช่นCONภายใต้ MS-DOS ฉันพูดถึงสิ่งนั้นเพียงเพราะฉันถูกกัดครั้งเดียวเมื่อฉันย่อไฟล์รวมจากconst.hถึงcon.hและใช้เวลาครึ่งชั่วโมงเพื่อหาสาเหตุที่คอมไพเลอร์หยุดทำงาน

ปรากฎว่า DOS ถูกละเว้นส่วนขยายสำหรับอุปกรณ์ซึ่งcon.hเหมือนกับconคอนโซลอินพุต (หมายความว่าคอมไพเลอร์กำลังรอให้ฉันพิมพ์ไฟล์ส่วนหัวก่อนที่จะดำเนินการต่อ)


4
ฉันพบว่าหน้า Wikipedia ค่อนข้างคลุมเครือและสับสนเช่น "ระบบปฏิบัติการบางระบบห้ามใช้อักขระบางตัว ... " ฉันกำลังมองหาตารางทั้งหมดที่แสดงรายการอักขระที่อนุญาตและไม่อนุญาตทั้งหมด
python dude

7
@python อย่ามองไปที่ตารางนั้นให้ดูที่ honkin ตัวใหญ่ที่อยู่ข้างใต้ (ชื่อ "การเปรียบเทียบข้อ จำกัด ของชื่อไฟล์") นั่นไม่ได้คลุมเครือในเนื้อหา
paxdiablo

56
คุณอาจต้องดูPOSIX "Fully portable filenames"รายการซึ่งมีรายการเหล่านี้:A–Z a–z 0–9 . _ -
Vladimir Kornea


1
@CpILL มี OS มากกว่า Windows, OSX และ Linux ... บางระบบมีระบบไฟล์ที่เรียบง่ายมาก
ลูกเต๋าหรูหรา

40

ตกลงดังนั้นการดูการเปรียบเทียบระบบไฟล์หากคุณสนใจเฉพาะระบบไฟล์ของผู้เล่นหลัก:

ดังนั้นไบต์ใด ๆ ยกเว้นNUL, \, /, :, *, ", <, >, |และคุณจะไม่สามารถมีไฟล์ / โฟลเดอร์โทร.หรือ..ไม่มีตัวควบคุม (แน่นอน)


8
สิ่งนี้ไม่ถูกต้อง /ลินุกซ์ไม่อนุญาตให้ Windows ไม่อนุญาตให้ใช้เครื่องหมายแบ็กสแลชและสตริงบางตัว (เช่นCON)
kgadek

8
ใช่เหตุที่ผมพูดยกเว้น
CpILL

3
บน Mac (ใช้งาน HFS +) ฉันสามารถสร้างไฟล์โดยใช้:ชื่อไฟล์ได้
erwaman

สิ่งนี้ไม่ถูกต้อง ดูคำตอบนี้สำหรับอักขระเพิ่มเติมที่ Windows ไม่อนุญาต
mbomb007

Windows ไม่อนุญาตตัวควบคุมใด ๆ เช่นกัน (แต่ Mac ทำนอกเหนือจาก NUL)
Thomas Tempelmann

23

บน Windows OS ให้สร้างไฟล์และระบุอักขระที่ไม่ถูกต้องเช่น\ในชื่อไฟล์ ด้วยเหตุนี้คุณจะได้รับป๊อปอัปที่มีอักขระที่ไม่ถูกต้องทั้งหมดในชื่อไฟล์

ป้อนคำอธิบายภาพที่นี่


5

เพื่อให้แม่นยำยิ่งขึ้นเกี่ยวกับ Mac OS X (ปัจจุบันเรียกว่า MacOS) /ใน Finder จะถูกแปล:เป็นระบบไฟล์ Unix

สิ่งนี้ทำขึ้นเพื่อความเข้ากันได้แบบย้อนหลังเมื่อ Apple ย้ายจาก Classic Mac OS

การใช้ a /ในชื่อไฟล์ใน Finder นั้นถูกต้องตามกฎหมายโดยดูที่ไฟล์เดียวกันในเทอร์มินัลไฟล์นั้นจะปรากฏขึ้นพร้อมกับไฟล์:.

และมันก็ใช้งานได้ในทางอื่นเช่นกัน: คุณไม่สามารถใช้/ในชื่อไฟล์กับเทอร์มินัลได้ แต่ a :ก็ใช้ได้และจะแสดงเป็น/ใน Finder

แอพพลิเคชั่นบางตัวอาจมีข้อ จำกัด มากกว่าและห้ามไม่ให้อักขระทั้งสองตัวเพื่อหลีกเลี่ยงความสับสนหรือเนื่องจากพวกมันยังคงใช้ตรรกะจาก Classic Mac OS รุ่นก่อนหน้าหรือเพื่อความเข้ากันได้ของชื่อระหว่างแพลตฟอร์ม


0

สำหรับชื่อไฟล์ "ภาษาอังกฤษ" จะใช้งานได้ดี ฉันกำลังใช้สิ่งนี้เพื่อล้างชื่อไฟล์ที่อัปโหลด ชื่อไฟล์ไม่ได้หมายถึงการเชื่อมโยงกับสิ่งใด ๆ บนดิสก์ แต่สำหรับเมื่อไฟล์กำลังดาวน์โหลดดังนั้นจึงไม่มีการตรวจสอบเส้นทาง

$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);

โดยทั่วไปจะตัดอักขระที่ไม่สามารถพิมพ์ได้และสงวนไว้ทั้งหมดสำหรับ Windows และ OS อื่น ๆ คุณสามารถขยายรูปแบบเพื่อรองรับพื้นที่และฟังก์ชันอื่น ๆได้อย่างง่ายดาย


-1

นี่คือรหัสสำหรับล้างชื่อไฟล์ใน python

import unicodedata

def clean_name(name, replace_space_with=None):
    """
    Remove invalid file name chars from the specified name

    :param name: the file name
    :param replace_space_with: if not none replace space with this string
    :return: a valid name for Win/Mac/Linux
    """

    # ref: https://en.wikipedia.org/wiki/Filename
    # ref: /programming/4814040/allowed-characters-in-filename
    # No control chars, no: /, \, ?, %, *, :, |, ", <, >

    # remove control chars
    name = ''.join(ch for ch in name if unicodedata.category(ch)[0] != 'C')

    cleaned_name = re.sub(r'[/\\?%*:|"<>]', '', name)
    if replace_space_with is not None:
        return cleaned_name.replace(' ', replace_space_with)
    return cleaned_name

2
รหัสไม่ตรวจสอบชื่อที่ไม่ถูกต้อง (สงวนไว้) และไม่ตรวจหาอักขระที่ไม่ถูกต้องใน replace_space_with ด้วย ความยาวของชื่อไฟล์เกินขอบเขต ดังนั้นจึง:return: a valid name for Win/Mac/Linuxไม่เป็นความจริงในทุกสถานการณ์
ack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.