Windows 및 Linux 디렉터리 이름에서 금지된 문자는 무엇입니까?
나는 그것을 알고 있습니다./
(제입니다.*
.
"
/
\
[
]
:
;
|
,
제가 또 뭘 놓쳤죠?
하지만 저는 포괄적인 가이드와 더블바이트 문자를 고려한 가이드가 필요합니다.외부 리소스에 링크하는 것은 저와 상관없습니다.
먼저 금지된 문자를 포함할 수 있는 이름을 사용하여 파일 시스템에 디렉터리를 만들어야 하므로 이러한 문자를 밑줄로 바꿀 계획입니다.그런 다음 이 디렉토리와 내용을 zip 파일(자바 사용)에 작성해야 하므로 zip 디렉토리의 이름에 대한 추가적인 조언을 주시면 감사하겠습니다.
인쇄가 금지된 ASCII 문자는 다음과 같습니다.
리눅스/유닉스:
/ (forward slash)
Windows:
< (less than) > (greater than) : (colon - sometimes works, but is actually NTFS Alternate Data Streams) " (double quote) / (forward slash) \ (backslash) | (vertical bar or pipe) ? (question mark) * (asterisk)
인쇄할 수 없는 문자
데이터가 인쇄 불가능한 문자를 허용하는 원본에서 가져온 경우 확인해야 할 항목이 더 있습니다.
리눅스/유닉스:
0 (NULL byte)
Windows:
0-31 (ASCII control characters)
참고: Linux/Unix 파일 시스템에서는 파일 이름에 제어 문자가 포함된 파일을 만드는 것이 합법적이지만 사용자가 이러한 파일을 처리하는 것은 악몽일 수 있습니다.
예약된 파일 이름
예약된 파일 이름은 다음과 같습니다.
Windows:
CON, PRN, AUX, NUL COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9 LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
파일 와 임의 확장자를 사용할 수 있습니다.를 들어, (파확일장임지수있정다습니할의로를자▁(다) 예:
LPT1.txt
).
기타 규칙
Windows:
파일 이름은 공백이나 점으로 끝날 수 없습니다.
macOS:
당신은 그것을 요구하지 않았지만, 만약을 위해:콜론
:
슬래시 및슬시래/
컨텍스트에 따라 허용되지 않습니다(예: 파인더는 슬래시를 지원하고 터미널은 콜론을 지원함).(자세한 내용)
금지된 파일 이름 문자의 "종합 안내서"는 문자뿐만 아니라 파일 이름도 예약하기 때문에 Windows에서 작동하지 않습니다.예, 네, 캐들은과 같은 .*
"
?
등은 금지되지만, 금지된 유효한 문자로만 구성된 이름은 무한합니다.예를 들어 공백과 점은 유효한 파일 이름 문자이지만 이러한 문자로만 구성된 이름은 금지됩니다.
에서는 대문자와 를 구분하지 (윈도우)라는 수 .A
는 이름을 가진 a
이미 존재합니다. 나쁜 것은,되는 이름인 나쁜에, 허이은된름들과 같은 이름들입니다.PRN
그리고.CON
다른 많은 사람들은 예약되어 있고 허용되지 않습니다.또한 Windows에는 몇 가지 길이 제한이 있습니다. 한 폴더에 유효한 파일 이름은 다른 폴더로 이동하면 유효하지 않을 수 있습니다.파일 및 폴더 이름 지정 규칙은 Microsoft 문서에 있습니다.
일반적으로 사용자 생성 텍스트를 사용하여 윈도우즈 디렉터리 이름을 만들 수 없습니다.할 수 있도록 사자가원하이름지을수정하있다려합같음안다니이만야들어름전과 같은 .A
,AB
,A2
예를 들어, 사용자가 생성한 이름과 해당 경로 등가물을 응용프로그램 데이터 파일에 저장하고 응용프로그램에서 경로 매핑을 수행합니다.
사용자가 생성한 폴더 이름을 반드시 허용해야 하는 경우 잘못된 폴더 이름인지 확인하는 유일한 방법은 예외를 포착하여 이름이 잘못되었다고 가정하는 것입니다.액세스 거부, 오프라인 드라이브 및 드라이브 공간 부족에 대한 예외가 잘못된 이름에 대한 예외와 겹치기 때문에 위험이 따릅니다.당신은 큰 상처의 깡통을 열고 있습니다.
및 시스템에서는 할 수 가 두 개뿐이었는데, 리눅스 및 기 유닉스 련 는 서 입 디 리 토 의 렉 다 니 이 NUL .'\0'
그리고 슬래시'/'
물론 슬래시는 경로 이름에 나타나 디렉터리 구성 요소를 구분할 수 있습니다.
소문에1 의하면 스티븐 본은 ('쉘'로 유명한) 254개의 파일이 포함된 디렉토리를 가지고 있었는데, 파일 이름에 나타날 수 있는 모든 문자(문자 코드)마다 하나씩입니다./
,'\0'
라는 .
물론 현재 디렉터리였습니다.)본 셸을 테스트하는 데 사용되었으며 백업 프로그램과 같은 부주의한 프로그램에 일상적으로 대혼란을 일으켰습니다.
다른 사람들은 Microsoft 및 Wikipedia에 대한 링크를 주제로 Windows 파일 이름에 대한 규칙을 다루었습니다.
MacOS X에는 대소문자를 구분하지 않는 파일 시스템이 있습니다.현재 버전의 콜론을 허용하는 것 같습니다.:
파일 이름으로, 역사적으로 항상 그런 것은 아니었습니다.
$ echo a:b > a:b
$ ls -l a:b
-rw-r--r-- 1 jonathanleffler staff 4 Nov 12 07:38 a:b
$
그러나 적어도 macOS BigSur 11.7에서는 파일 시스템이 유효한 UTF-8 문자열이 아닌 파일 이름을 허용하지 않습니다.즉, 파일 이름이 UTF-8(0xC0, 0xC1, 0xF5-0xFF)에서 항상 유효하지 않은 바이트로 구성될 수 없으며 연속 바이트 0x80을 사용할 수 없습니다.0xBF는 파일 이름의 유일한 바이트입니다.제공된 오류는 92 잘못된 바이트 시퀀스입니다.
POSIX는 다음으로 구성된 휴대용 파일 이름 문자 집합을 정의합니다.
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -
이러한 문자로만 구성된 이름을 계속 사용하면 Windows(윈도우)에서 여전히 몇 가지 문제가 추가되지만 대부분의 문제를 피할 수 있습니다.
1 It was Kernighan & Pike in ['The Practice of Programming'](http://www.cs.princeton.edu/~bwk/tpop.webpage/) who said as much in Chapter 6, Testing, §6.5 Stress Tests:
셸(셸로 된)을 쓸 때, 는 스티브 본을 제외한 각 한이름을 의 파일 .
'\0'
와 슬래시는 유닉스 파일 이름에 표시할 수 없는 두 문자입니다.그는 패턴 매칭과 토큰화의 모든 테스트를 위해 그 디렉토리를 사용했습니다.(테스트 디렉토리는 물론 프로그램에 의해 작성되었습니다.)그 후 몇 년 동안, 그 디렉터리는 파일 트리 걷기 프로그램의 골칫거리였습니다. 그것은 그것들을 파괴하도록 시험했습니다.
에 "" " " " " " " 항목이 ..
그리고...
따라서 254개의 파일이 아닌 253개의 파일(및 2개의 디렉토리) 또는 255개의 이름 항목이었습니다.이것은 일화의 효과나 그것이 묘사하는 신중한 테스트에 영향을 미치지 않습니다.
TPOP은 이전에는 http://plan9.bell-labs.com/cm/cs/tpop 과 http://cm.bell-labs.com/cm/cs/tpop 에 있었지만, 현재는 둘 다 중단되었습니다.TPOP에 대한 위키백과도 참조하십시오.
문자 블랙리스트를 만드는 대신 화이트리스트를 사용할 수 있습니다.모든 점을 고려할 때 파일 또는 디렉터리 이름 컨텍스트에서 사용할 수 있는 문자의 범위는 매우 짧으며, 사용자에게 매우 구체적인 이름 지정 요구 사항이 없는 한 사용자가 전체 ASCII 테이블을 사용할 수 없는 경우 사용자의 응용 프로그램에 대해 해당 이름을 보유하지 않습니다.
대상 파일 시스템의 예약된 이름 문제는 해결되지 않지만 화이트리스트를 사용하면 소스의 위험을 더 쉽게 완화할 수 있습니다.
그런 점에서, 이것은 안전하다고 간주될 수 있는 다양한 문자입니다.
- 문자(a-z A-Z) - 필요한 경우 유니코드 문자도 포함
- 숫자(0-9)
- 밑줄(_)
- 하이픈(-)
- 공간
- 점(.).
허용할 추가 안전 문자.이 외에도 공간과 점에 대한 몇 가지 추가 규칙을 적용하면 됩니다.일반적으로 이 정도면 충분합니다.
- 이름에는 하나 이상의 문자 또는 숫자가 포함되어야 합니다(점/공백만 사용하지 않으려면).
- 이름은 문자 또는 숫자로 시작해야 합니다(선행 점/공백을 피하려면).
- 이름은 점이나 공백으로 끝날 수 없습니다(익스플로러처럼 점이나 공백이 있는 경우 트리밍만 수행).
이것은 이미 상당히 복잡하고 무의미한 이름을 허용합니다.예를 들어 이러한 이름은 다음 규칙을 사용하여 사용할 수 있으며 Windows/Linux에서 유효한 파일 이름입니다.
A...........ext
B -.- .ext
기본적으로 화이트리스트에 포함된 문자가 거의 없는 경우에도 실제로 무엇이 적절한지 결정하고 그에 따라 이름을 검증/조정해야 합니다.애플리케이션 중 하나에서 위와 동일한 규칙을 사용했지만 중복된 점과 공간을 제거했습니다.
Windows(윈도우)에서 탐색기를 통해 파일 이름을 바꾸고 새 이름에 백슬래시( /)를 입력하는 것이 정답을 알려주는 쉬운 방법입니다.잘못된 문자 목록을 알려주는 메시지 상자가 나타납니다.
A filename cannot contain any of the following characters:
\ / : * ? " < > |
Microsoft 문서 - 파일, 경로 및 네임스페이스 이름 지정 - 이름 지정 규칙
연구 목적으로만 사용된다면 파일 이름에 대한 이 위키백과 항목을 보는 것이 가장 좋습니다.
사용자 입력의 유효성을 확인하고 이를 기반으로 파일 이름을 만드는 휴대용 기능을 작성하려면 간단히 말해 그렇지 않습니다.Perl's File::과 같은 휴대용 모듈을 살펴보십시오.이러한 "단순한" 작업을 수행하는 데 필요한 모든 홉을 한 눈에 볼 수 있도록 하십시오.
가능한 다양한 접근 방식 논의
합법적이고 합법적이지 않은 것을 정의하는 데 어려움이 있었고 화이트리스트가 제안되었습니다.그러나 Windows 뿐만 아니라 많은 Unixoid OS에서 유니코드와 같은 8비트 이상의 문자를 지원합니다.UTF-8과 같은 인코딩에 대해서도 이야기할 수 있습니다. 조나단 레플러가 현대 리눅스에 대한 정보를 제공하고 MacOS에 대한 세부 정보를 설명하는 것에 대해 언급한 것을 고려할 수 있습니다.위키피디아는 (예를 들어) 다음과 같이 말합니다.
수식어 colon [(아래 7. 참조)은 파일 이름에 사용되는 Segoe UI 글꼴의 colon과 동일하기 때문에 Windows 파일 이름에 사용되기도 합니다.[상속된 ASCII] 콜론 자체는 허용되지 않습니다.
그러므로, 저는 유니코드 동형문자를 사용하여 "불법" 문자를 대체하는 훨씬 더 자유로운 접근법을 제시하고자 합니다.비교 가능한 사용 사례에서 결과가 훨씬 더 읽기 쉬우며 사용된 글꼴(Windows 기본값의 경우 매우 넓은 3903자)에 의해서만 제한된다는 것을 알게 되었습니다.또한 교체된 내용에서 원래 내용을 복원할 수도 있습니다.
가능한 선택사항 및 연구 노트
정리를 잘하기 위해 항상 캐릭터와 이름, 16진수 표현을 지정할 것입니다.후자는 대소문자를 구분하지 않으며 선행 0을 자유롭게 추가하거나 생략할 수 있습니다.U+002A
그리고.u+2a
▁alternatives▁▁if.더 정보나 대안을 더 이나 더 것을 .가능하다면 더 많은 정보나 대안을 제시해 보겠습니다. 더 많은 정보나 더 나은 정보를 언제든지 보여주십시오.
( 대신)
U+2A * ASTERISK
), 예를 들어 나열된 많은 항목 중 하나를 사용할 수 있습니다.U+2217 ∗ (ASTERISK OPERATOR)
는또.Full Width Asterisk U+FF0A *
.u+20f0 ⃰ combining asterisk above
기호에 대한 분음 부호를 결합하는 것도 유효한 선택일 수 있습니다.결합 문자에 대한 자세한 내용은 4.을 참조하십시오.( 대신)
U+2E . full stop
), 예를 들어, 이 중 하나가 좋은 옵션이 될 수 있습니다.⋅ U+22C5 dot operator
.( 대신)
U+22 " quotation mark
), 를 사용할 수 있습니다.“ U+201C english leftdoublequotemark
더 많은 대안이 여기에 있습니다.저는 또한 월리 브록웨이의 대답에 대한 좋은 제안들을 포함했습니다, 이 경우에.u+2036 ‶ reversed double prime
그리고.u+2033 ″ double prime
지금부터 저는 그 출처에서 나온 아이디어를 ³¹로 표기하겠습니다.( 대신)
U+2F / SOLIDUS
), 를 사용할 수 있습니다.∕ DIVISION SLASH U+2215
(여기에 표시됨)̸ U+0338 COMBINING LONG SOLIDUS OVERLAY
,̷ COMBINING SHORT SOLIDUS OVERLAY U+0337
또는u+2044 ⁄ fraction slash
¹³. 다음을 포함한 일부 문자의 공백에 주의하십시오.combining
또는overlay
--> 즉, --> 같것생수때있에문, 것은이와 같은 을 만들 수 입니다.̸th̷is
를 더하면 ̷ is,즉 공이추가면되즉는 --> ̷̸백,▁--,̸ th ̷ is
(두번째▁(번째▁the두)COMBINING SHORT SOLIDUS OVERLAY
오버플로-스캐너에서 는 스택 오버플로-스캐너에서 불량으로 보입니다.에 에.
\
(U+5C Reverse solidus
), 를 사용할 수 있습니다.⧵ U+29F5 Reverse solidus operator
(더) 또는u+20E5 ⃥ combining reverse solidus overlay
¹³의대체하기(
U+5B [ Left square bracket
) 및 (U+005D ] Right square bracket
), , , 를 할 수U+FF3B[ FULLWIDTH LEFT SQUARE BRACKET
그리고.U+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET
(여기서부터는 더 많은 가능성이 있습니다.)( 대신)
u+3a : colon
), 를 사용할 수 있습니다.U+2236 ∶ RATIO (for mathematical usage)
또는U+A789 ꞉ MODIFIER LETTER COLON
(콜론(문자) 참조). 파일 이름에 사용되는 Segoe UI 글꼴의 콜론과 동일하기 때문에 Windows 파일 이름에 사용되기도 합니다.콜론 자체는 허용되지 않습니다... 소스 및 더 많은 대체품은 여기를 참조하십시오.또 다른 대안은 다음과 같습니다.u+1361 ፡ ethiopic wordspace
¹³의( 대신)
u+3b ; semicolon
), 를 사용할 수 있습니다.U+037E ; GREEK QUESTION MARK
(여기 참조).대상(
u+7c | vertical line
, , , , , , , 등의 좋은 이 있습니다.U+2223 ∣ DIVIDES
,U+0964 । DEVANAGARI DANDA
,U+01C0 ǀ LATIN LETTER DENTAL CLICK
(위키백과의 마지막 것) 또는.U+2D4F ⵏ Tifinagh Letter Yan
또한 상자 그리기 문자에는 다양한 다른 옵션이 포함되어 있습니다.( 대신)
, U+002C COMMA
), , , 를 할 수‚ U+201A SINGLE LOW-9 QUOTATION MARK
(여기 참조).대상(
U+003F ? QUESTION MARK
입니다:), , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .U+FF1F ? FULLWIDTH QUESTION MARK
또는U+FE56 ﹖ SMALL QUESTION MARK
(여기와 여기에서).딩바츠 블록("질문" 검색)에서도 2개가 더 있습니다.u+203d ‽ interrobang
¹³의내 컴퓨터가 변경되지 않은 상태로 수락하는 것처럼 보이지만, 나는 여전히 포함하고 있습니다.
>
(u+3e greater-than sign
및 ) 및<
(u+3c less-than sign
) 완전성을 위해.여기서 가장 좋은 대체품은 아마도 다음과 같은 견적 블록에서 나온 것입니다.u+203a › single right-pointing angle quotation mark
그리고.u+2039 ‹ single left-pointing angle quotation mark
각각 다음과 같다.에는 tifinagh ▁contains만 포함되어 .ⵦ (u+2D66)
◦대체할 문제<
은 마막개념은입니다.⋖ less-than with dot u+22D6
그리고.⋗ greater-than with dot u+22D7
.
추가 아이디어는 이 블록에서 예를 찾아볼 수도 있습니다.아직도 더 많은 아이디어가 필요합니까?여기서 원하는 캐릭터를 그려보고 제안사항을 살펴보세요.소중한 것을 찾으시면 댓글을 달아주세요.
이 문자를 입력하는 방법
입력하고 싶다고 말합니다.ⵏ (Tifinagh Letter Yan)
위해,든지 이할 수 .ⵏ
이 Unicode Lookup과 같은 적합한 플랫폼에서 (추가하십시오.)0x
16진수) 또는 해당 유니코드 테이블(이 경우 "티피나 문자 얀"만 검색할 수 있음)을 검색합니다.유니코드 번호를 얻어야 합니다.U+2D4F
코드 "HTML"입니다.ⵏ
(note that 2D4F
is hexadecimal for 11599
)이러한 지식을 바탕으로 다음과 같은 특수 문자를 생성할 수 있는 몇 가지 옵션이 있습니다.
- 유니코드 변환기를 가리키는 코드 포인트 또는 다시 유니코드 조회를 통해 숫자 표현을 유니코드 문자로 역변환합니다(아래의 코드 포인트 기준을 각각 10진수 또는 16진수로 설정해야 함).
- 자동 단축키의 원라이너 마크로:
:?*:altpipe::{U+2D4F}
타이핑하는ⵏ
현대에altpipe
입니다. 할 수 . - Alt 문자 또는 Alt 코드는 길게 누른 상태에서 원하는 문자의 십진수를 따릅니다(예를 들어, 자세한 내용은 여기 또는 저기 표 참조).예를 들어 +11599가 됩니다.대부분의 프로그램은 모든 유니코드(쓰기 시간 기준)에 대해 이 창 기능을 완전히 지원하지 않습니다.Microsoft Office는 일반적으로 작동하는 예외적인 경우이며, 일부 다른 OS는 유사한 기능을 제공합니다.MS Word에 Alt 조합이 있는 이러한 문자를 입력하는 것은 Wally Brockway가 이미 언급한 그의 답변에서 제안하는 방법이기도 합니다. 만약 당신이 모든 16진수 값을 십진수 asc로 전송하고 싶지 않다면, 당신은 그곳에서 그들 중 일부를 찾을 수 있습니다.
- MS Office에서 이 MS 기사에 설명된 대로 +를 사용하여 문자를 생성할 수도 있습니다.
- 만약 당신이 그것이 거의 필요하지 않다면, 물론 당신은 여전히 그것을 입력하는 대신 당신이 선택한 특별한 문자를 복사할 수 있습니다.
Windows의 경우 PowerShell을 사용하여 확인할 수 있습니다.
$PathInvalidChars = [System.IO.Path]::GetInvalidPathChars() #36 chars
UTF-8 코드를 표시하려면 변환할 수 있습니다.
$enc = [system.Text.Encoding]::UTF8
$PathInvalidChars | foreach { $enc.GetBytes($_) }
$FileNameInvalidChars = [System.IO.Path]::GetInvalidFileNameChars() #41 chars
$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference
정규식을 찾는 사람:
const BLACKLIST = /[<>:"\/\\|?*]/g;
윈도우즈 10(2019)에서는 다음 문자를 입력하려고 할 때 오류로 인해 다음 문자가 금지됩니다.
파일 이름에는 다음 문자를 사용할 수 없습니다.
Christopher Oezbek의 답변을 기반으로 한 창에 대한 c# 구현입니다.
컨테이너로 인해 더 복잡해졌습니다.폴더 부울이지만 모든 항목을 포함할 수 있기를 바랍니다.
/// <summary>
/// This will replace invalid chars with underscores, there are also some reserved words that it adds underscore to
/// </summary>
/// <remarks>
/// https://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names
/// </remarks>
/// <param name="containsFolder">Pass in true if filename represents a folder\file (passing true will allow slash)</param>
public static string EscapeFilename_Windows(string filename, bool containsFolder = false)
{
StringBuilder builder = new StringBuilder(filename.Length + 12);
int index = 0;
// Allow colon if it's part of the drive letter
if (containsFolder)
{
Match match = Regex.Match(filename, @"^\s*[A-Z]:\\", RegexOptions.IgnoreCase);
if (match.Success)
{
builder.Append(match.Value);
index = match.Length;
}
}
// Character substitutions
for (int cntr = index; cntr < filename.Length; cntr++)
{
char c = filename[cntr];
switch (c)
{
case '\u0000':
case '\u0001':
case '\u0002':
case '\u0003':
case '\u0004':
case '\u0005':
case '\u0006':
case '\u0007':
case '\u0008':
case '\u0009':
case '\u000A':
case '\u000B':
case '\u000C':
case '\u000D':
case '\u000E':
case '\u000F':
case '\u0010':
case '\u0011':
case '\u0012':
case '\u0013':
case '\u0014':
case '\u0015':
case '\u0016':
case '\u0017':
case '\u0018':
case '\u0019':
case '\u001A':
case '\u001B':
case '\u001C':
case '\u001D':
case '\u001E':
case '\u001F':
case '<':
case '>':
case ':':
case '"':
case '/':
case '|':
case '?':
case '*':
builder.Append('_');
break;
case '\\':
builder.Append(containsFolder ? c : '_');
break;
default:
builder.Append(c);
break;
}
}
string built = builder.ToString();
if (built == "")
{
return "_";
}
if (built.EndsWith(" ") || built.EndsWith("."))
{
built = built.Substring(0, built.Length - 1) + "_";
}
// These are reserved names, in either the folder or file name, but they are fine if following a dot
// CON, PRN, AUX, NUL, COM0 .. COM9, LPT0 .. LPT9
builder = new StringBuilder(built.Length + 12);
index = 0;
foreach (Match match in Regex.Matches(built, @"(^|\\)\s*(?<bad>CON|PRN|AUX|NUL|COM\d|LPT\d)\s*(\.|\\|$)", RegexOptions.IgnoreCase))
{
Group group = match.Groups["bad"];
if (group.Index > index)
{
builder.Append(built.Substring(index, match.Index - index + 1));
}
builder.Append(group.Value);
builder.Append("_"); // putting an underscore after this keyword is enough to make it acceptable
index = group.Index + group.Length;
}
if (index == 0)
{
return built;
}
if (index < built.Length - 1)
{
builder.Append(built.Substring(index));
}
return builder.ToString();
}
는 유하불 유스문 자는닉일 수 /
그리고.NULL
그러나 명령행 해석에 대한 고려 사항이 포함되어야 합니다.
를 들어,을 예를들, 파이을지것어로 지정하는 일 수 .1>&2
또는2>&1
UNIX에서 이와 같은 파일 이름은 명령줄에서 사용할 때 잘못 해석될 수 있습니다.
마찬가지로 파일 이름을 지정할 수 있습니다.$PATH
하지만 명령줄에서 액세스하려고 하면 셸이 변환합니다.$PATH
변수 값으로.
Framework .NET System.IO
잘못된 파일 시스템 문자에 대해 다음 기능을 제공합니다.
이러한 함수는 .NET 런타임이 실행 중인 플랫폼에 따라 적절한 결과를 반환해야 합니다.즉, 이러한 기능에 대한 설명서 페이지의 비고는 다음과 같습니다.
이 메서드에서 반환된 배열에 파일 및 디렉터리 이름에 잘못된 문자 집합이 포함되어 있는지 확인할 수 없습니다.잘못된 문자의 전체 집합은 파일 시스템에 따라 다를 수 있습니다.
Windows 파일 이름에서 금지된 문자는 모든 외래 문자도 금지될 것이라고 항상 가정했습니다.사용할 / 수 없다는 것, 그리고 특히 저를 짜증나게 했습니다.어느 날 저는 사실상 금지된 문자들만 있다는 것을 알게 되었습니다.기타 유니코드 문자를 사용할 수 있습니다.그래서 제가 찾을 수 있는 금지된 것들과 가장 가까운 유니코드 문자들이 식별되었고 MS Word 매크로가 +,?: + 등으로 만들어졌습니다.이제 대체 문자를 사용하여 Word로 파일 이름을 만들고 Windows 파일 이름으로 복사합니다.지금까지 저는 아무 문제가 없었습니다.
다음은 대체 문자(Alt + 십진수 유니코드)입니다.
- ⃰ ⇔ Alt8432
- ⁄ ⇔ Alt8260
- ⃥ ⇔ Alt8421
- ∣ ⇔ Alt8739
- ◦ § 11622
- ⮚ ⇔ Alt11162
- ‽ ⇔ Alt8253
- ◦ 4961
- ‶ ⇔ Alt8246
- ″ ⇔ Alt8243
테스트를 위해 이 모든 문자를 사용하여 파일 이름을 만들었고 Windows에서 이를 수락했습니다.
Python에서는 이 정도면 충분합니다.
def fix_filename(name, max_length=255):
"""
Replace invalid characters on Linux/Windows/MacOS with underscores.
List from https://stackoverflow.com/a/31976060/819417
Trailing spaces & periods are ignored on Windows.
>>> fix_filename(" COM1 ")
'_ COM1 _'
>>> fix_filename("COM10")
'COM10'
>>> fix_filename("COM1,")
'COM1,'
>>> fix_filename("COM1.txt")
'_.txt'
>>> all('_' == fix_filename(chr(i)) for i in list(range(32)))
True
"""
return re.sub(r'[/\\:|<>"?*\0-\x1f]|^(AUX|COM[1-9]|CON|LPT[1-9]|NUL|PRN)(?![^.])|^\s|[\s.]$', "_", name[:max_length], flags=re.IGNORECASE)
다음과 같은 추가 레거시 항목은 이 오래된 목록을 참조하십시오.=
FAT32로
2017년 4월 18일 현재, 이 주제에 대한 답변 중 단순한 흑백 문자 및 파일 이름 목록이 명확하지 않으며 많은 답변이 있습니다.
제가 생각해낸 가장 좋은 제안은 사용자가 원하는 대로 파일 이름을 지정하도록 하는 것이었습니다.응용 프로그램이 파일을 저장하려고 할 때 오류 처리기를 사용하여 예외를 탐지하고 파일 이름이 잘못되었다고 가정하고(저장 경로가 정상인지 확인한 후) 새 파일 이름을 입력하라는 메시지를 표시합니다.최상의 결과를 얻으려면 사용자가 올바르게 선택하거나 포기할 때까지 계속되는 루프 내에 이 확인 절차를 배치합니다.저에게 가장 잘 작동했습니다(적어도 VBA에서는).
셸에서는 로 묶을 수 .'
하나의 인용문 자체를 제외하고, 통제 문자를 표현할 수 없습니다. 왜냐하면\
확장되지 않았습니다.로 묶은 수 은 표가붙내단자따액체것세문은에다자옴다같니가음합능단때따있에수옴이이문따일연따스기옴표와중과할표열하옴결표는을일로은에서문자열▁with▁like▁is와 같이 문자열을 단일 할 수 입니다.'I'"'"'m'
은 파일 사수있다습니라는 할 때 할 수 있습니다."I'm"
(여기서도 이중 따옴표를 사용할 수 있습니다.)
따라서 컨트롤 문자는 셸에 입력하기가 너무 어렵기 때문에 모든 컨트롤 문자를 피해야 합니다.로 시작하는 은 대시가 두 의 명령이 입니다. 특히 대시로 시작하는 파일은 대시가 두 개 없는 경우 대부분의 명령이 옵션으로 읽기 때문입니다.--
하거나, 또는 " 에전또사지정니합다가자용는이다니지▁them합▁before"로 합니다../
인 그은또시숨깁다니을작한도 숨깁니다.-
.
친절하고 싶다면 셸과 일반적인 명령어가 구문 요소로 사용하는 문자를 사용하지 마십시오. 때때로 위치에 따라 다르므로 계속 사용할 수 있습니다.-
하지만 첫 글자처럼은 아닙니다; 와 같습니다..
의미하는 경우에만 첫 문자로 사용할 수 있습니다("숨김 파일").평균일 때 파일 이름은 VT100 이스케이프 시퀀스 ;-)이므로 에 의해 출력이 왜곡됩니다.
Windows에서 인터넷 바로 가기를 만들 때 파일 이름을 만들려면 마이너스로 변환되는 슬래시를 제외한 잘못된 문자를 건너뜁니다.
저도 같은 필요성이 있었고, 권장 사항이나 표준 참고 자료를 찾고 있었는데 이 스레드를 발견했습니다.현재 파일 및 디렉터리 이름에서 피해야 할 문자 블랙리스트는 다음과 같습니다.
$CharactersInvalidForFileName = {
"pound" -> "#",
"left angle bracket" -> "<",
"dollar sign" -> "$",
"plus sign" -> "+",
"percent" -> "%",
"right angle bracket" -> ">",
"exclamation point" -> "!",
"backtick" -> "`",
"ampersand" -> "&",
"asterisk" -> "*",
"single quotes" -> "“",
"pipe" -> "|",
"left bracket" -> "{",
"question mark" -> "?",
"double quotes" -> "”",
"equal sign" -> "=",
"right bracket" -> "}",
"forward slash" -> "/",
"colon" -> ":",
"back slash" -> "\\",
"lank spaces" -> "b",
"at sign" -> "@"
};
언급URL : https://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names
'programing' 카테고리의 다른 글
iPhone Simulator 캐시를 삭제하는 것보다 더 빠르고 더 나은 방법이 있습니까? (0) | 2023.05.28 |
---|---|
C# "As"에 해당하는 VB.NET (0) | 2023.05.28 |
f-flash 대 str.format » (0) | 2023.05.28 |
i = 0의 경우, (i += i++)가 0과 같은 이유는 무엇입니까? (0) | 2023.05.28 |
IN 값 목록을 기준으로 주문 (0) | 2023.05.28 |