Microsoft MVP성태의 닷넷 이야기
Windows: 266. Windows - 대소문자 구분이 가능한 파일 시스템 [링크 복사], [링크+제목 복사],
조회: 5185
글쓴 사람
정성태 (kevin at jennifersoft.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

Windows - 대소문자 구분이 가능한 파일 시스템

일례로, WSL 환경에서 대소문자 구분이 있는 파일을 윈도우로 복사하면,

$ pwd
/tmp/testdir
$ echo test > test.txt
$ echo Test > Test.txt
$ cp -r . /mnt/c/temp/testdir
cp: cannot create regular file '/mnt/c/temp/testdir/Test.txt': File exists

첫 번째 test.txt 파일은 복사가 되지만, 두 번째 Test.txt 파일은 복사가 되지 않습니다. 잘 아시는 것처럼, 윈도우의 파일 시스템은 대소문자를 구분하지 않기 때문입니다.

이게 딱히 그동안 문제가 되지는 않았는데, 위에서 설명한 사례처럼 WSL과의 연동이 되다 보니 문제로 부각된 것 같습니다. 그리고, 이런 문제로 인해 윈도우도 디렉터리에 대소문자를 구분할 수 있는 설정을 지원하게 되었습니다.

// Windows 10, build 17107 이후부터 지원

Adjust case sensitivity
; https://learn.microsoft.com/en-us/windows/wsl/case-sensitivity

The Windows file system supports setting case sensitivity with attribute flags per directory.


그래서 다음과 같은 명령어로 특정 디렉터리에 한해 대소문자 구분을 가능하게 합니다.

fsutil.exe file setCaseSensitiveInfo <path>

결국 위에서 문제가 됐던 상황이라면 이렇게 해결할 수 있습니다.

// 현재는 대소문자 구분이 안 되지만,
c:\temp> fsutil.exe file queryCaseSensitiveInfo c:\temp\testdir
Case sensitive attribute on directory c:\temp\testdir is disabled.

// 대소문자 구분하도록 설정 (변경은 관리자 권한만 가능)
c:\temp> fsutil.exe file setCaseSensitiveInfo c:\temp\testdir
Case sensitive attribute on directory c:\temp\testdir is enabled.

// 다시 대소문자 구분 없음으로 변경하려면 disable 옵션만 추가
c:\temp> fsutil.exe file setCaseSensitiveInfo c:\temp\testdir disable

이후 다시 복사를 해보면,

$ cp -r . /mnt/c/temp/testdir

test.txt와 Test.txt 파일이 모두 복사됩니다.

c:\temp\testdir> dir /b
Test.txt
test.txt

c:\temp\testdir> type Test.txt
Test

c:\temp\testdir> type test.txt
test




이렇게 대소문자 구분이 되는 경우, 당연히 프로그램 측에서도 대소문자를 잘 구분해야 합니다. 가령, C#에서 위의 파일을 접근하는 경우,

internal class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(File.ReadAllText(@"C:\temp\testdir\Test.txt")); // OK
        Console.WriteLine(File.ReadAllText(@"C:\temp\testdir\test.txt")); // OK

        Console.WriteLine(File.ReadAllText(@"C:\temp\testdir\tEst.txt")); // Unhandled exception. System.IO.FileNotFoundException: Could not find file 'C:\temp\testdir\tEst.txt'.
    }
}

해당 디렉터리에 대해 정확히 대소문자를 지정해야만 파일이 열리므로 주의해야 합니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 10/26/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13793정성태10/28/20245118C/C++: 183. C++ - 윈도우에서 한글(및 유니코드)을 포함한 콘솔 프로그램을 컴파일 및 실행하는 방법
13792정성태10/27/20244606Linux: 99. Linux - 프로세스의 실행 파일 경로 확인
13791정성태10/27/20244869Windows: 267. Win32 API의 A(ANSI) 버전은 DBCS를 사용할까요?파일 다운로드1
13790정성태10/27/20244588Linux: 98. Ubuntu 22.04 - 리눅스 커널 빌드 및 업그레이드
13789정성태10/27/20244889Linux: 97. menuconfig에 CONFIG_DEBUG_INFO_BTF, CONFIG_DEBUG_INFO_BTF_MODULES 옵션이 없는 경우
13788정성태10/26/20244425Linux: 96. eBPF (bpf2go) - fentry, fexit를 이용한 트레이스
13787정성태10/26/20244919개발 환경 구성: 730. github - Linux 커널 repo를 윈도우 환경에서 git clone하는 방법 [1]
13786정성태10/26/20245185Windows: 266. Windows - 대소문자 구분이 가능한 파일 시스템
13785정성태10/23/20244954C/C++: 182. 윈도우가 운영하는 2개의 Code Page파일 다운로드1
13784정성태10/23/20245219Linux: 95. eBPF - kprobe를 이용한 트레이스
13783정성태10/23/20244826Linux: 94. eBPF - vmlinux.h 헤더 포함하는 방법 (bpf2go에서 사용)
13782정성태10/23/20244589Linux: 93. Ubuntu 22.04 - 커널 이미지로부터 커널 함수 역어셈블
13781정성태10/22/20244768오류 유형: 930. WSL + eBPF: modprobe: FATAL: Module kheaders not found in directory
13780정성태10/22/20245525Linux: 92. WSL 2 - 커널 이미지로부터 커널 함수 역어셈블
13779정성태10/22/20244824개발 환경 구성: 729. WSL 2 - Mariner VM 커널 이미지 업데이트 방법
13778정성태10/21/20245633C/C++: 181. C/C++ - 소스코드 파일의 인코딩, 바이너리 모듈 상태의 인코딩
13777정성태10/20/20244920Windows: 265. Win32 API의 W(유니코드) 버전은 UCS-2일까요? UTF-16 인코딩일까요?
13776정성태10/19/20245226C/C++: 180. C++ - 고수준 FILE I/O 함수에서의 Unicode stream 모드(_O_WTEXT, _O_U16TEXT, _O_U8TEXT)파일 다운로드1
13775정성태10/19/20245466개발 환경 구성: 728. 윈도우 환경의 개발자를 위한 UTF-8 환경 설정
13774정성태10/18/20245164Linux: 91. Container 환경에서 출력하는 eBPF bpf_get_current_pid_tgid의 pid가 존재하지 않는 이유
13773정성태10/18/20244851Linux: 90. pid 네임스페이스 구성으로 본 WSL 2 + docker-desktop
13772정성태10/17/20245127Linux: 89. pid 네임스페이스 구성으로 본 WSL 2 배포본의 계층 관계
13771정성태10/17/20245032Linux: 88. WSL 2 리눅스 배포본 내에서의 pid 네임스페이스 구성
13770정성태10/17/20245312Linux: 87. ps + grep 조합에서 grep 명령어를 사용한 프로세스를 출력에서 제거하는 방법
13769정성태10/15/20246088Linux: 86. Golang + bpf2go를 사용한 eBPF 기본 예제파일 다운로드1
13768정성태10/15/20245362C/C++: 179. C++ - _O_WTEXT, _O_U16TEXT, _O_U8TEXT의 Unicode stream 모드파일 다운로드2
1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...