운영 체제에 따라 파일 이름에서 허용되는 문자 목록을 어디에서 찾을 수 있습니까? (예 : Linux의 경우 문자 :
는 파일 이름에 허용되지만 Windows에는 허용되지 않습니다)
운영 체제에 따라 파일 이름에서 허용되는 문자 목록을 어디에서 찾을 수 있습니까? (예 : Linux의 경우 문자 :
는 파일 이름에 허용되지만 Windows에는 허용되지 않습니다)
답변:
Wikipedia Filename 페이지 에서 시작해야 합니다. 적당한 크기의 테이블 ( 파일 이름 제한 비교 )이 있으며 많은 파일 시스템에 예약 된 문자가 나열되어 있습니다.
또한 MS-DOS 와 같은 예약 된 파일 이름을 포함하여 각 파일 시스템에 대한 기타 정보가 많이 CON
있습니다. 필자는 include 파일을 짧게 하고 컴파일러가 중단 된 이유를 알아내는 데 30 분을 보냈 const.h
을 때 한 번 물 렸기 때문에 언급했습니다 con.h
.
입력 콘솔 과 정확히 동일 하도록 DOS 에서 장치의 확장명을 무시했습니다 (물론 컴파일러는 헤더 파일을 계속 입력 하기를 기다렸습니다 ).con.h
con
POSIX "Fully portable filenames"
항목 을 보는 것입니다 , 이것들은 다음과 같습니다 :A–Z a–z 0–9 . _ -
메인 플레이어 파일 시스템에만 관심이 있다면 파일 시스템 비교를 살펴 보십시오.
NUL
, \
, /
, :
, *
, "
, <
, >
, |
. 또한 시작 또는 끝에 공백 문자가없고 끝에 마침표가 없습니다 .:
또는/
NUL
또는/
그래서 어떤 바이트를 제외하고는 NUL
, \
, /
, :
, *
, "
, <
, >
, |
당신이 파일을 가질 수 없습니다 / 폴더를 호출하지 .
나 ..
(물론)과 더 제어 문자.
/
. Windows는 백 슬래시와 일부 문자열 (예 :)을 허용하지 않습니다 CON
.
:
에서 이름 이 s 인 파일을 만들 수 있습니다.
/
Finder에서 Mac OS X (현재 MacOS) 에 대해 더 정확하게 설명 :
하는 것은 Unix 파일 시스템에서 해석됩니다 .
Apple이 Classic Mac OS에서 이동할 때 이전 버전과의 호환성을 위해 수행되었습니다.
/
Finder에서 파일 이름에 a 를 사용하는 것이 합법적이며 터미널에서 동일한 파일을 보면으로 표시됩니다 :
.
그리고 다른 방법으로도 작동합니다 /
. 터미널과 함께 파일 이름에 a를 사용할 수 :
는 없지만 a 는 OK이며 /
Finder에 a 로 표시됩니다 .
일부 응용 프로그램은 혼란을 피하기 위해 또는 이전 Classic Mac OS의 논리를 유지하거나 플랫폼 간의 이름 호환성을 위해 더 제한적이고 두 문자를 모두 금지 할 수 있습니다.
"영어 로캘"파일 이름의 경우이 기능이 훌륭합니다. 업로드 된 파일 이름을 삭제하는 데 이것을 사용하고 있습니다. 파일 이름은 디스크의 어떤 것에도 연결되어 있지 않습니다. 파일을 다운로드 할 때를위한 것이므로 경로 확인이 없습니다.
$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
기본적으로 Windows 및 기타 OS에서 인쇄 할 수없고 예약 된 모든 문자를 제거합니다. 다른 로케일 및 기능을 지원하기 위해 패턴을 쉽게 확장 할 수 있습니다 .
다음은 파이썬에서 파일 이름을 정리하는 코드입니다.
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
모든 상황에서 사실이 아닙니다.