IT박스

파일 이름에 허용되는 문자

itboxs 2020. 7. 20. 07:51
반응형

파일 이름에 허용되는 문자


운영 체제에 따라 파일 이름에서 허용되는 문자 목록을 어디에서 찾을 수 있습니까? (예 : Linux의 경우 문자 :는 파일 이름에 허용되지만 Windows에는 허용되지 않습니다)


Wikipedia Filename 페이지 에서 시작해야 합니다. 적당한 크기의 테이블 ( 파일 이름 제한 비교 )이 있으며 많은 파일 시스템에 예약 된 문자가 나열되어 있습니다.

또한 MS-DOS 와 같은 예약 된 파일 이름을 포함하여 각 파일 시스템에 대한 기타 정보가 많이 CON있습니다. 필자는 include 파일을 짧게 하고 컴파일러가 중단 된 이유를 알아내는 데 30 분을 보냈 const.h때 한 번 물 렸기 때문에 언급했습니다 con.h.

입력 콘솔 과 정확히 동일 하도록 DOS 에서 장치의 확장명을 무시했습니다 (물론 컴파일러는 헤더 파일을 계속 입력 하기를 기다렸습니다 ).con.hcon


Windows OS에서 파일을 작성하고 파일 \이름 과 같이 유효하지 않은 문자를 제공하십시오 . 결과적으로 파일 이름에 유효하지 않은 문자가 모두 포함 된 팝업이 나타납니다.

여기에 이미지 설명을 입력하십시오


메인 플레이어 파일 시스템에만 관심이 있다면 파일 시스템 비교를 살펴 보십시오.

  • 윈도우 (FAT32, NTFS)를 제외한 모든 유니 코드 NUL, \, /, :, *, ", <, >,|
  • Mac (HFS, HFS +) : :또는/
  • 리눅스 (EXT [2-4])을 제외한 모든 바이트 NUL또는/

그래서 어떤 바이트를 제외하고는 NUL, \, /, :, *, ", <, >, |당신이 파일을 가질 수 없습니다 / 폴더를 호출하지 ...(물론)과 더 제어 문자.


/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: https://stackoverflow.com/questions/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

참고 URL : https://stackoverflow.com/questions/4814040/allowed-characters-in-filename

반응형