ฉันจะค้นหารายการอักขระที่อนุญาตในชื่อไฟล์ได้ที่ไหนทั้งนี้ขึ้นอยู่กับระบบปฏิบัติการ (เช่นบน Linux :
อนุญาตให้ใช้อักขระในชื่อไฟล์ แต่ไม่สามารถใช้กับ Windows ได้)
ฉันจะค้นหารายการอักขระที่อนุญาตในชื่อไฟล์ได้ที่ไหนทั้งนี้ขึ้นอยู่กับระบบปฏิบัติการ (เช่นบน Linux :
อนุญาตให้ใช้อักขระในชื่อไฟล์ แต่ไม่สามารถใช้กับ Windows ได้)
คำตอบ:
คุณควรเริ่มต้นด้วยหน้าชื่อไฟล์ Wikipedia มีตารางขนาดพอเหมาะ ( การเปรียบเทียบข้อ จำกัด ของชื่อไฟล์ ) แสดงรายการอักขระที่สงวนไว้สำหรับระบบไฟล์จำนวนมาก
นอกจากนี้ยังมีข้อมูลอื่น ๆมากมายเกี่ยวกับระบบไฟล์แต่ละระบบรวมถึงชื่อไฟล์ที่สงวนไว้เช่นCON
ภายใต้ MS-DOS ฉันพูดถึงสิ่งนั้นเพียงเพราะฉันถูกกัดครั้งเดียวเมื่อฉันย่อไฟล์รวมจากconst.h
ถึงcon.h
และใช้เวลาครึ่งชั่วโมงเพื่อหาสาเหตุที่คอมไพเลอร์หยุดทำงาน
ปรากฎว่า DOS ถูกละเว้นส่วนขยายสำหรับอุปกรณ์ซึ่งcon.h
เหมือนกับcon
คอนโซลอินพุต (หมายความว่าคอมไพเลอร์กำลังรอให้ฉันพิมพ์ไฟล์ส่วนหัวก่อนที่จะดำเนินการต่อ)
POSIX "Fully portable filenames"
รายการซึ่งมีรายการเหล่านี้:A–Z a–z 0–9 . _ -
ตกลงดังนั้นการดูการเปรียบเทียบระบบไฟล์หากคุณสนใจเฉพาะระบบไฟล์ของผู้เล่นหลัก:
NUL
, \
, /
, :
, *
, "
, <
, ,>
|
นอกจากนี้ห้ามเว้นวรรคที่จุดเริ่มต้นหรือจุดสิ้นสุดและไม่มีจุดต่อท้าย:
หรือ/
NUL
หรือ/
ดังนั้นไบต์ใด ๆ ยกเว้นNUL
, \
, /
, :
, *
, "
, <
, >
, |
และคุณจะไม่สามารถมีไฟล์ / โฟลเดอร์โทร.
หรือ..
ไม่มีตัวควบคุม (แน่นอน)
/
ลินุกซ์ไม่อนุญาตให้ Windows ไม่อนุญาตให้ใช้เครื่องหมายแบ็กสแลชและสตริงบางตัว (เช่นCON
)
:
ชื่อไฟล์ได้
เพื่อให้แม่นยำยิ่งขึ้นเกี่ยวกับ Mac OS X (ปัจจุบันเรียกว่า MacOS) /
ใน Finder จะถูกแปล:
เป็นระบบไฟล์ Unix
สิ่งนี้ทำขึ้นเพื่อความเข้ากันได้แบบย้อนหลังเมื่อ Apple ย้ายจาก Classic Mac OS
การใช้ a /
ในชื่อไฟล์ใน Finder นั้นถูกต้องตามกฎหมายโดยดูที่ไฟล์เดียวกันในเทอร์มินัลไฟล์นั้นจะปรากฏขึ้นพร้อมกับไฟล์:
.
และมันก็ใช้งานได้ในทางอื่นเช่นกัน: คุณไม่สามารถใช้/
ในชื่อไฟล์กับเทอร์มินัลได้ แต่ a :
ก็ใช้ได้และจะแสดงเป็น/
ใน Finder
แอพพลิเคชั่นบางตัวอาจมีข้อ จำกัด มากกว่าและห้ามไม่ให้อักขระทั้งสองตัวเพื่อหลีกเลี่ยงความสับสนหรือเนื่องจากพวกมันยังคงใช้ตรรกะจาก Classic Mac OS รุ่นก่อนหน้าหรือเพื่อความเข้ากันได้ของชื่อระหว่างแพลตฟอร์ม
สำหรับชื่อไฟล์ "ภาษาอังกฤษ" จะใช้งานได้ดี ฉันกำลังใช้สิ่งนี้เพื่อล้างชื่อไฟล์ที่อัปโหลด ชื่อไฟล์ไม่ได้หมายถึงการเชื่อมโยงกับสิ่งใด ๆ บนดิสก์ แต่สำหรับเมื่อไฟล์กำลังดาวน์โหลดดังนั้นจึงไม่มีการตรวจสอบเส้นทาง
$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
โดยทั่วไปจะตัดอักขระที่ไม่สามารถพิมพ์ได้และสงวนไว้ทั้งหมดสำหรับ Windows และ OS อื่น ๆ คุณสามารถขยายรูปแบบเพื่อรองรับพื้นที่และฟังก์ชันอื่น ๆได้อย่างง่ายดาย
นี่คือรหัสสำหรับล้างชื่อไฟล์ใน 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
:return: a valid name for Win/Mac/Linux
ไม่เป็นความจริงในทุกสถานการณ์