나는 리눅스에서 / 불법이며 Windows에서 다음과 같은 불법임을 알고 있습니다 (제 생각에) *
.
"
/
\
[
]
:
;
|
,
내가 뭘 놓치고 있니?
그러나 포괄적 인 안내서와 2 바이트 문자를 고려한 안내서가 필요합니다. 외부 리소스에 연결하는 것이 좋습니다.
먼저 금지 된 문자를 포함 할 수있는 이름을 사용하여 파일 시스템에 디렉토리를 작성해야하므로 해당 문자를 밑줄로 바꿀 계획입니다. 그런 다음이 디렉토리와 그 내용을 zip 파일 (Java를 사용하여)에 작성해야하므로 zip 디렉토리의 이름에 관한 추가 조언이 필요합니다.
답변
금지 된 파일 이름 문자에 대한 “포괄적 인 안내서”는 파일 이름과 문자를 예약하기 때문에 Windows에서 작동하지 않습니다. 그렇습니다. 같은 문자 *
"
?
와 다른 문자
는 금지되어 있지만 금지 된 유효한 문자로만 구성되는 이름은 무한합니다. 예를 들어, 공백과 점은 유효한 파일 이름 문자이지만 해당 문자로만 구성된 이름은 금지됩니다.
Windows는 대문자와 소문자를 구분하지 않으므로 이름이 지정된 폴더가 A
있으면 이름을 가진 폴더를 만들 수 없습니다 a
. 더 나쁜 것은, 겉으로-허용 이름은 좋아 PRN
하고 CON
, 많은 다른 사람은, 예약 및 허용되지 않습니다. Windows에는 몇 가지 길이 제한이 있습니다. 한 폴더에서 유효한 파일 이름은 다른 폴더로 이동하면 유효하지 않을 수 있습니다. 파일 및 폴더 이름 지정 규칙
은 Microsoft 문서에 있습니다.
일반적으로 사용자 생성 텍스트를 사용하여 Windows 디렉토리 이름을 작성할 수 없습니다. 당신이 그들이 원하는 이름 무엇이든 사용자 수 있도록하려면, 당신은 같은 안전 이름을 만들어야합니다 A
, AB
, A2
등., 매장 사용자가 생성 한 이름과 응용 프로그램 데이터 파일에 자신의 경로 등가물 및 응용 프로그램에서 경로 매핑을 수행합니다.
사용자가 생성 한 폴더 이름을 반드시 허용해야하는 경우 폴더 이름이 유효하지 않은지 확인하는 유일한 방법은 예외를 포착하고 이름이 유효하지 않은 것으로 가정하는 것입니다. 액세스 거부, 오프라인 드라이브 및 드라이브 공간 부족에 대한 예외는 유효하지 않은 이름에 대해 발생할 수있는 예외와 겹치므로 위험이 따릅니다. 큰 상처를 줄 수 있습니다.
답변
먼저 간단하게하고 질문에 대답합시다.
-
금지 인쇄 가능한 ASCII 문자 는 다음과 같습니다.
-
리눅스 / 유닉스 :
/ (forward slash)
-
윈도우 :
< (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)
-
윈도우 :
0-31 (ASCII control characters)
참고 : Linux / Unix 파일 시스템에서는 파일 이름에 제어 문자가있는 파일을 작성하는 것이 합법적이지만 사용자가 그러한 파일을 처리하는 것은 악몽 일 수 있습니다. .
-
-
예약 된 파일 이름
다음 파일 이름이 예약되어 있습니다.
-
윈도우 :
CON, PRN, AUX, NUL COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9 LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
(자체적으로 그리고 임의의 파일 확장자를 가진 예
LPT1.txt
).
-
-
다른 규칙
-
윈도우 :
파일 이름은 공백이나 점으로 끝날 수 없습니다.
-
답변
Linux 및 기타 Unix 관련 시스템에서는 파일 또는 디렉토리 이름에 표시 할 수없는 문자가 두 개 뿐이며 NUL '\0'
및 슬래시 '/'
입니다. 물론 슬래시는 디렉토리 구성 요소를 분리하는 경로 이름에 나타날 수 있습니다.
소문 하나는 그것을 가지고 그 스티븐 Bourne 씨 (제외 254 개 파일, 파일 이름에 나타날 수있는 모든 단일 문자 (문자 코드)에 대한 하나를 포함하는 디렉토리를했다 ( ‘쉘’명예의) /
, '\0'
; 이름은 .
물론, 현재 디렉토리이었다 ). Bourne 쉘을 테스트하는 데 사용되었으며 백업 프로그램과 같은 경고가없는 프로그램에 대해 정기적으로 혼란을 겪었습니다.
다른 사람들은 Windows 규칙을 다뤘습니다.
MacOS X에는 대소 문자를 구분하지 않는 파일 시스템이 있습니다.
1 6 장 테스트, §6.5 스트레스 테스트에서 많이 언급 한 것은 프로그래밍 실습 에서 Kernighan & Pike 였습니다.
Steve Bourne은 자신의 Unix 쉘 (Bourne 쉘로 알려짐)
'\0'
을 작성할 때 Unix에 나타날 수없는 두 문자를 제외한 각 바이트 값 과 슬래시를 제외 하고 하나의 문자 이름으로 254 개의 파일 디렉토리를 만들었습니다. 파일 이름. 그는 패턴 일치 및 토큰 화에 대한 모든 테스트 방법에 해당 디렉토리를 사용했습니다. (테스트 디렉토리는 물론 프로그램에 의해 만들어졌습니다.) 그 후 몇 년 동안 그 디렉토리는 파일 트리 워킹 프로그램의 골칫거리였습니다. 그들은 그들을 파괴 테스트했습니다.
디렉토리 항목을 포함해야합니다 유의 .
하고 ..
는 틀림없이 253 파일 (2 디렉토리) 또는 255 개 이름 항목이 아닌 254 개 파일이었다, 그래서. 이것은 일화의 효과 나 설명하는 테스트에 영향을 미치지 않습니다.
답변
블랙리스트 문자를 만드는 대신 화이트리스트를 사용할 수 있습니다 . 고려 된 모든 것, 파일 또는 디렉토리 이름 컨텍스트에서 의미가있는 문자 범위는 매우 짧으며, 매우 특정한 이름 지정 요구 사항이 없으면 사용자가 전체 ASCII 테이블을 사용할 수없는 경우 사용자가이를 응용 프로그램에 대해 보유하지 않습니다.
대상 파일 시스템에서 예약 된 이름의 문제점을 해결하지는 않지만 화이트리스트를 사용하면 소스의 위험을 완화하기가 더 쉽습니다.
그 정신에서 이것은 안전한 것으로 간주 될 수있는 다양한 문자입니다.
- 문자 (az AZ) -필요한 경우 유니 코드 문자
- 숫자 (0-9)
- 밑줄 (_)
- 하이픈 (-)
- 우주
- 도트 (.)
그리고 당신이 허용하려는 추가 안전 문자. 이 외에도 공간과 점에 관한 몇 가지 추가 규칙 을 시행해야합니다 . 이것은 일반적으로 충분합니다 :
- 이름은 하나 이상의 문자 또는 숫자를 포함해야합니다 (점 / 공백 만 피하십시오)
- 이름은 문자 나 숫자로 시작해야합니다 (앞의 점 / 공백을 피하려면)
- 이름은 점이나 공백으로 끝날 수 없습니다 (탐색기와 같이 존재하는 경우 간단히 자릅니다)
이것은 이미 상당히 복잡하고 무의미한 이름을 허용합니다. 예를 들어, 이러한 이름은 다음 규칙으로 가능하며 Windows / Linux에서 유효한 파일 이름입니다.
A...........ext
B -.- .ext
본질적으로 허용 된 문자가 너무 적더라도 실제 의미를 결정하고 그에 따라 이름을 확인 / 조정해야합니다. 내 응용 프로그램 중 하나에서 위와 동일한 규칙을 사용했지만 중복 점과 공백을 제거했습니다.
답변
Windows가 답을 알려주는 쉬운 방법은 탐색기를 통해 파일 이름을 바꾸고 새 이름으로 /를 입력하는 것입니다. Windows에서 잘못된 문자 목록을 알려주는 메시지 상자가 나타납니다.
A filename cannot contain any of the following characters:
\ / : * ? " < > |
답변
연구 목적으로 만 사용하는 것이 가장 좋은 방법은 Filenames에서이 Wikipedia 항목 을 보는 것 입니다.
사용자 입력의 유효성을 검사하고이를 기반으로 파일 이름을 생성하는 이식 가능한 함수를 작성하려면 짧은 대답은 아닙니다 . Perl의 File :: Spec 과 같은 휴대용 모듈을 살펴보면 이러한 “간단한”작업을 수행하는 데 필요한 모든 홉을 엿볼 수 있습니다.
답변
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