D

Deep Research Archives

  • new
  • |
  • threads
  • |
  • comments
  • |
  • show
  • |
  • ask
  • |
  • jobs
  • |
  • submit
  • Guidelines
  • |
  • FAQ
  • |
  • Lists
  • |
  • API
  • |
  • Security
  • |
  • Legal
  • |
  • Contact
Search…
threads
submit
login
▲
Windows에서 Python을 이용한 폴더 아이콘 변경 최적화 방안 빈번한 변경 대응(docs.google.com)

1 point by slswlsek 2 months ago | flag | hide | 0 comments

Windows에서 Python을 이용한 폴더 아이콘 변경 최적화 방안: 빈번한 변경 대응

I. 서론

Windows 운영체제에서 폴더의 시각적 표현은 사용자의 파일 시스템 탐색 효율성에 영향을 미칩니다. 기본 폴더 아이콘 대신 특정 목적이나 내용에 맞는 사용자 지정 아이콘을 사용하면 폴더 식별이 용이해지고 작업 환경을 개인화할 수 있습니다.1 특히, 특정 폴더의 아이콘을 프로그램적으로, 그리고 빈번하게 변경해야 하는 요구사항이 발생할 수 있습니다. 예를 들어, 폴더의 상태 변화(예: 동기화 상태, 작업 완료 여부)를 시각적으로 표시하거나, 자동화된 작업 흐름의 일부로서 폴더 아이콘을 동적으로 관리하는 경우가 해당됩니다.

본 보고서는 Windows 환경에서 Python 스크립트를 사용하여 폴더 아이콘을 안정적이고 효율적으로 변경하는 최상의 방법을 제시하는 것을 목표로 합니다. 특히, 아이콘을 한 번 변경하는 것뿐만 아니라, 필요에 따라 자주 아이콘을 변경하고 즉시 반영해야 하는 시나리오에 중점을 둡니다. 이를 위해 Windows 폴더 사용자 지정의 핵심 메커니즘인 desktop.ini 파일, 관련 파일 및 폴더 속성, 그리고 변경 사항을 즉시 반영하기 위한 Windows Shell 및 아이콘 캐시 관리 방법을 Python 코드 예제와 함께 상세히 분석합니다.

핵심적인 접근 방식은 다음과 같습니다:

  1. 대상 폴더 내에 특정 형식의 desktop.ini 파일을 생성하거나 수정합니다.
  2. Windows가 사용자 지정 아이콘을 인식하도록 폴더와 desktop.ini 파일에 필수 속성(예: 읽기 전용, 시스템, 숨김)을 설정합니다.
  3. 아이콘 변경 사항이 지연 없이 즉시 사용자 인터페이스에 반영되도록 Windows Shell에 변경 사항을 알리고 필요한 경우 아이콘 캐시를 갱신합니다.

이러한 과정을 Python의 표준 라이브러리 및 Windows API 호출을 통해 구현하는 방법을 구체적으로 살펴보고, 발생 가능한 문제점과 이를 해결하기 위한 견고한 솔루션 구축 방안을 제시합니다.

II. Windows 폴더 아이콘 사용자 지정 메커니즘 이해

Windows에서 폴더의 아이콘을 사용자 지정하는 기능은 주로 폴더 내에 위치한 desktop.ini라는 숨겨진 시스템 구성 파일을 통해 이루어집니다.2 이 파일은 폴더의 표시 방식, 아이콘, 지역화된 이름 등 다양한 시각적 및 행동적 속성을 정의하는 데 사용됩니다.2

1. desktop.ini 파일의 역할과 구조

desktop.ini 파일은 일반 텍스트 파일이지만, Windows 탐색기가 이를 인식하고 해석하기 위해서는 특정 조건을 만족해야 합니다. 이 파일은 일반적으로 .ShellClassInfo 섹션을 포함하며, 이 섹션 내의 키-값 쌍을 통해 폴더의 사용자 지정을 정의합니다.2

폴더 아이콘을 지정하는 데 가장 중요한 항목은 IconResource입니다. 이 항목은 사용할 아이콘 파일의 경로와 해당 파일 내 아이콘의 인덱스를 지정합니다.1

Ini, TOML

IconResource=<아이콘 파일 경로>,<인덱스>
; 예시: IconResource=C:\MyIcons\my_icon.ico,0
; 예시: IconResource=%SystemRoot%\System32\shell32.dll,3

여기서 <아이콘 파일 경로>는 .ico, .dll, .exe 파일 등이 될 수 있으며, <인덱스>는 해당 파일 내에서 사용할 아이콘의 순서(0부터 시작)를 나타냅니다.2 만약 파일에 아이콘이 하나만 포함되어 있다면 인덱스는 0입니다.2

일부 시스템에서 생성된 desktop.ini 파일에는 `` 섹션도 포함될 수 있습니다.7 이 섹션은 폴더 보기 설정과 관련이 있을 수 있으나, 아이콘 변경 자체에 필수적인 요소는 아닐 수 있습니다. 하지만 호환성을 위해 포함하는 것이 관찰됩니다.

desktop.ini 파일은 반드시 유니코드 형식으로 저장되어야 합니다. 이는 지역화된 문자열 등을 올바르게 처리하기 위함입니다.2 Python으로 파일을 작성할 때는 utf-16 인코딩을 사용하는 것이 Windows 환경에서 최대 호환성을 보장하는 방법 중 하나입니다.

2. 필수 파일 및 폴더 속성

Windows 탐색기가 desktop.ini 파일을 인식하고 사용자 지정 아이콘을 표시하게 하려면, 폴더 자체와 desktop.ini 파일 모두 특정 파일 속성을 가져야 합니다.

  • 폴더 속성: 사용자 지정 아이콘을 표시하려는 폴더는 반드시 읽기 전용(Read-Only) 또는 시스템(System) 속성을 가져야 합니다.2 이 속성들은 Windows 탐색기에게 해당 폴더가 특별한 사용자 지정을 포함할 수 있음을 알리는 신호 역할을 합니다.7 이름과는 달리, 폴더의 읽기 전용 속성은 폴더 내용의 쓰기 가능 여부에 영향을 주지 않으며, 단지 사용자 지정 적용 여부를 나타내는 플래그로 사용됩니다.7 폴더를 복사하거나 이동하는 과정에서 이 속성이 손실될 수 있으며, 이 경우 사용자 지정 아이콘이 더 이상 표시되지 않을 수 있습니다.10
  • desktop.ini 파일 속성: desktop.ini 파일 자체는 일반 사용자에게 보이지 않도록 숨김(Hidden) 속성과 시스템(System) 속성을 모두 가져야 합니다.2 이 속성들이 설정되어야 Windows 탐색기가 이 파일을 폴더 사용자 지정 정보로 올바르게 처리합니다.

이러한 속성 설정은 폴더 아이콘 사용자 지정의 필수 전제 조건이며, 이 중 하나라도 누락되면 아이콘 변경이 적용되지 않습니다.

3. 아이콘 파일 요구사항

사용자 지정 아이콘으로 사용할 파일은 특정 형식을 따르는 것이 좋습니다.

  • .ico 형식 선호: Windows 아이콘 파일 형식인 .ico가 가장 일반적으로 권장됩니다.1 .ico 파일은 다양한 크기(예: 16x16, 32x32, 48x48, 256x256)와 색 깊이의 이미지를 하나의 파일에 포함할 수 있어, 다양한 보기 환경에서 최적의 아이콘 품질을 제공할 수 있습니다.1
  • 기타 형식: .dll 또는 .exe 파일 내에 포함된 아이콘 리소스를 사용할 수도 있습니다.2 Windows 시스템 DLL(예: %SystemRoot%\System32\shell32.dll, %SystemRoot%\System32\imageres.dll)에는 다양한 기본 아이콘이 포함되어 있어 활용 가능합니다.1 .bmp 파일도 이론적으로 가능하지만 2, 일반적으로 사용되지 않습니다.
  • 아이콘 소스: 사용자 지정 아이콘은 직접 만들거나, 온라인 아이콘 라이브러리(예: DeviantArt, Iconfinder, IconArchive)에서 다운로드할 수 있습니다.1 PNG와 같은 다른 이미지 형식을 .ico로 변환해야 할 경우, 온라인 변환 도구(예: ConvertICO)나 이미지 편집 소프트웨어를 사용할 수 있습니다.1

III. Python을 이용한 사용자 지정 구현: 핵심 메커니즘

Python 스크립트를 사용하여 Windows 폴더 아이콘을 변경하려면 앞서 설명한 메커니즘을 코드 레벨에서 구현해야 합니다. 이는 desktop.ini 파일을 생성/수정하고, 필요한 파일/폴더 속성을 설정하는 두 가지 주요 단계로 구성됩니다.

1. Python으로 desktop.ini 파일 생성 및 수정

desktop.ini 파일은 특정 구조를 가진 텍스트 파일이므로, Python의 표준 파일 입출력 기능을 사용하여 생성하거나 수정할 수 있습니다. 중요한 점은 파일을 유니코드 형식, 특히 Windows와의 호환성을 위해 UTF-16 인코딩으로 저장하는 것입니다.2

다음은 지정된 폴더 경로와 아이콘 경로를 받아 desktop.ini 파일을 작성하는 Python 함수 예시입니다.

Python

import os

def write_desktop_ini(folder_path, icon_path, icon_index=0):
"""
지정된 폴더에 desktop.ini 파일을 생성하거나 덮어씁니다.

Args:  
    folder\_path (str): 대상 폴더의 절대 경로.  
    icon\_path (str): 아이콘 파일의 경로 (절대 또는 상대).  
                      DLL/EXE 파일 경로도 가능합니다.  
    icon\_index (int): 아이콘 파일 내의 아이콘 인덱스 (기본값 0).

Returns:  
    bool: 성공 시 True, 실패 시 False.  
"""  
ini\_path \= os.path.join(folder\_path, 'desktop.ini')  
\# IconResource 경로의 백슬래시를 이스케이프 처리할 필요는 없습니다.  
\# Windows는 경로 구분자로 슬래시(/)도 인식합니다.  
content \= f"""  

IconResource={icon_path},{icon_index}

Mode=
Vid=
FolderType=Generic
"""
try:
# 최대 호환성을 위해 utf-16 인코딩 사용
with open(ini_path, 'w', encoding='utf-16') as f:
f.write(content)
print(f"Successfully wrote desktop.ini to {ini_path}")
return True
except Exception as e:
print(f"Error writing desktop.ini: {e}")
return False

# 사용 예시:
# write_desktop_ini(r"C:\MyFolder", r"C:\MyIcons\my_icon.ico")
# write_desktop_ini(r"C:\MyFolder", r"%SystemRoot%\System32\shell32.dll", 3) # 폴더 아이콘

이 코드는 섹션과 필수적인 `IconResource` 라인을 생성합니다.2 또한, 시스템에서 생성된 파일에서 자주 관찰되는 섹션도 완전성을 위해 포함합니다.7

2. Python으로 필수 파일/폴더 속성 설정

desktop.ini 파일을 생성한 후에는 Windows가 이를 인식하도록 폴더와 파일에 올바른 속성을 설정해야 합니다. 여기서 Python의 표준 os.chmod 함수는 Windows 환경에서 제한적인 기능만 제공한다는 점에 유의해야 합니다.

  • os.chmod의 한계: Python의 os.chmod는 주로 POSIX 시스템의 권한 모델을 기반으로 합니다. Windows에서는 이 함수를 사용하여 파일의 읽기 전용 플래그(stat.S_IWRITE를 제거/설정)를 토글할 수는 있지만 15, 폴더 아이콘 사용자 지정에 필수적인 시스템(System) 또는 숨김(Hidden) 속성을 직접 설정하는 기능은 제공하지 않습니다.17 따라서 os.chmod만으로는 필요한 모든 속성을 설정할 수 없습니다.
  • 권장 접근 방식: ctypes를 이용한 Win32 API 호출: Windows 고유의 파일 속성을 설정하기 위한 가장 표준적이고 안정적인 방법은 Python의 ctypes 모듈을 사용하여 Windows API 함수를 직접 호출하는 것입니다. ctypes는 Python 표준 라이브러리에 포함되어 있어 별도의 외부 라이브러리 설치가 필요 없습니다.
    • 핵심 함수는 kernel32.dll에 있는 SetFileAttributesW입니다.15 W 접미사는 유니코드 문자열(wchar_t*)을 인수로 받는 버전을 의미합니다.
    • 필요한 Windows 파일 속성 상수(예: FILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_SYSTEM)를 정의해야 합니다. 이 값들은 Windows 헤더 파일이나 관련 문서에서 찾을 수 있습니다.15 FILE_ATTRIBUTE_SYSTEM의 값은 0x4입니다.
    • 다음은 ctypes를 사용하여 폴더(읽기 전용 또는 시스템 속성)와 desktop.ini 파일(숨김 및 시스템 속성)에 필요한 속성을 설정하는 Python 함수 예시입니다. 오류 처리 로직을 포함합니다.

Python
import ctypes
from ctypes import wintypes
import os
import stat # S_IWRITE 확인용이지만 여기서는 직접 사용하지 않음

# Windows 파일 속성 상수 (일부)
FILE_ATTRIBUTE_READONLY = 0x0001
FILE_ATTRIBUTE_HIDDEN = 0x0002
FILE_ATTRIBUTE_SYSTEM = 0x0004
FILE_ATTRIBUTE_DIRECTORY = 0x0010
FILE_ATTRIBUTE_NORMAL = 0x0080 # 속성 초기화 시 사용될 수 있음
INVALID_FILE_ATTRIBUTES = -1

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

# GetFileAttributesW 함수 정의
get_file_attributes = kernel32.GetFileAttributesW
get_file_attributes.argtypes = (wintypes.LPCWSTR,) # 유니코드 문자열 포인터
get_file_attributes.restype = wintypes.DWORD

# SetFileAttributesW 함수 정의
set_file_attributes = kernel32.SetFileAttributesW
set_file_attributes.argtypes = (wintypes.LPCWSTR, wintypes.DWORD) # 경로, 설정할 속성
set_file_attributes.restype = wintypes.BOOL # 성공 시 True 반환

def set_folder_attributes_for_icon(folder_path):
"""폴더에 ReadOnly 속성을 설정합니다 (또는 System 속성)."""
try:
# 기존 속성을 먼저 가져와서 다른 속성 유지
current_attrs = get_file_attributes(folder_path)
if current_attrs == INVALID_FILE_ATTRIBUTES:
raise ctypes.WinError(ctypes.get_last_error())

    \# ReadOnly 속성 추가 (System 속성을 사용해도 됨)  
    new\_attrs \= current\_attrs | FILE\_ATTRIBUTE\_READONLY  
    \# 또는: new\_attrs \= current\_attrs | FILE\_ATTRIBUTE\_SYSTEM

    if not set\_file\_attributes(folder\_path, new\_attrs):  
        raise ctypes.WinError(ctypes.get\_last\_error())  
    print(f"Successfully set ReadOnly attribute on folder: {folder\_path}")  
    return True  
except Exception as e:  
    print(f"Error setting folder attributes for {folder\_path}: {e}")  
    return False

def set_desktop_ini_attributes(ini_path):
"""desktop.ini 파일에 Hidden 및 System 속성을 설정합니다."""
try:
# 기존 속성을 먼저 가져옴
current_attrs = get_file_attributes(ini_path)
if current_attrs == INVALID_FILE_ATTRIBUTES:
raise ctypes.WinError(ctypes.get_last_error())

    \# Hidden 및 System 속성 추가  
    new\_attrs \= current\_attrs | FILE\_ATTRIBUTE\_HIDDEN | FILE\_ATTRIBUTE\_SYSTEM

    if not set\_file\_attributes(ini\_path, new\_attrs):  
        raise ctypes.WinError(ctypes.get\_last\_error())  
    print(f"Successfully set Hidden+System attributes on: {ini\_path}")  
    return True  
except Exception as e:  
    print(f"Error setting desktop.ini attributes for {ini\_path}: {e}")  
    return False

# 사용 예시:
# ini_file = os.path.join(r"C:\MyFolder", 'desktop.ini')
# if os.path.exists(ini_file):
# set_folder_attributes_for_icon(r"C:\MyFolder")
# set_desktop_ini_attributes(ini_file)

  • (대안) win32api: 외부 라이브러리인 pywin32를 사용할 수 있다면, 이 라이브러리가 제공하는 win32api.SetFileAttributes 및 win32con 모듈을 통해 유사한 기능을 더 높은 수준의 인터페이스로 구현할 수 있습니다.17 하지만 ctypes는 Python 표준 라이브러리이므로 추가 설치 없이 사용할 수 있다는 장점이 있습니다.

이러한 Windows API 직접 호출의 필요성은 플랫폼 간 Python 개발에서 흔히 나타나는 현상을 보여줍니다. 표준 라이브러리 함수(os.chmod 등)는 종종 POSIX 표준에 맞춰져 있어, Windows와 같은 특정 플랫폼의 고유 기능을 완전히 지원하지 못할 수 있습니다. 따라서 Windows에서 깊은 수준의 OS 통합이 필요한 작업에는 ctypes나 pywin32를 통한 직접적인 API 상호작용이 필수적입니다. 올바른 API를 사용하지 않으면 desktop.ini 파일이 존재하더라도 아이콘 사용자 지정이 적용되지 않는 문제가 발생합니다.

IV. 아이콘 업데이트 보장: Windows Shell 및 아이콘 캐시 갱신

desktop.ini 파일을 올바르게 생성하고 필요한 속성을 설정했더라도, 변경된 아이콘이 Windows 탐색기에 즉시 반영되지 않는 경우가 많습니다. 이는 Windows가 성능 향상을 위해 아이콘 정보를 캐시에 저장하고 이를 적극적으로 사용하기 때문입니다.10

1. 아이콘 캐시 문제

Windows 탐색기는 폴더나 파일의 아이콘을 표시할 때 매번 원본 파일에서 아이콘을 읽어오는 대신, 시스템에 저장된 아이콘 캐시(IconCache.db 파일 등)를 참조합니다.21 desktop.ini 파일을 통해 폴더 아이콘을 변경해도 탐색기가 즉시 이 변경 사항을 인지하고 캐시를 갱신하지 않으면, 사용자는 이전 아이콘을 계속 보게 됩니다. 이 문제는 탐색기를 재시작하거나, 사용자가 로그아웃 후 다시 로그인하거나, 시스템을 재부팅하거나, 캐시를 수동으로 삭제하고 재생성할 때까지 지속될 수 있습니다.13 아이콘을 빈번하게 변경해야 하는 시나리오에서는 이러한 지연이 사용자 경험을 크게 저해하므로 반드시 해결해야 합니다.

2. 권장 해결책: SHChangeNotify API 호출

Windows는 파일 시스템의 변경 사항을 Shell(탐색기 포함)에 알리기 위한 공식적인 API 함수인 SHChangeNotify를 제공합니다(shell32.dll 내 위치).8 이 함수를 호출하면 특정 파일이나 폴더에 변경이 발생했음을 Shell 구성 요소에 알리고, 관련 캐시된 정보(예: 아이콘)를 무효화하여 갱신하도록 유도할 수 있습니다.

이 함수를 Python에서 사용하기 위해 ctypes 모듈을 활용할 수 있습니다.

  • 주요 매개변수:

    • wEventId: 발생한 이벤트의 유형을 지정합니다. desktop.ini 변경으로 인한 아이콘 업데이트에는 SHCNE_UPDATEITEM(특정 항목 업데이트)이 종종 적합합니다.9 속성 변경 후에는 SHCNE_ATTRIBUTES도 관련성이 있을 수 있습니다. SHCNE_ASSOCCHANGED(전역 파일 연결 변경)는 때때로 사용되지만, 너무 광범위하여 관련 없는 아이콘까지 새로 고치거나 화면 깜박임을 유발할 수 있으므로 신중하게 사용해야 합니다.23
    • uFlags: dwItem1 및 dwItem2 매개변수를 해석하는 방법을 지정합니다. SHCNF_PATH 또는 SHCNF_PATHW(유니코드 경로)는 이들이 경로 문자열임을 나타냅니다.26 SHCNF_IDLIST는 더 복잡한 PIDL(Pointer to an Item Identifier List)을 사용합니다.
    • dwItem1: 변경된 항목의 경로(예: 폴더 경로)를 지정합니다. 유니코드 경로를 사용하려면 LPCWSTR 타입으로 전달해야 합니다.
    • dwItem2: 선택적인 두 번째 경로이며, 보통 None (NULL)으로 설정합니다.
  • ctypes를 이용한 구현: 다음은 SHChangeNotify를 호출하는 Python 함수 예시입니다. 필요한 상수 정의를 포함합니다.
    Python
    import ctypes
    from ctypes import wintypes

    shell32 = ctypes.WinDLL('shell32', use_last_error=True)

    # SHChangeNotify 이벤트 ID (일부)
    SHCNE_RENAMEITEM = 0x00000001
    SHCNE_CREATE = 0x00000002
    SHCNE_DELETE = 0x00000004
    SHCNE_MKDIR = 0x00000008
    SHCNE_RMDIR = 0x00000010
    SHCNE_MEDIAINSERTED = 0x00000020
    SHCNE_MEDIAREMOVED = 0x00000040
    SHCNE_DRIVEREMOVED = 0x00000080
    SHCNE_DRIVEADD = 0x00000100
    SHCNE_NETSHARE = 0x00000200
    SHCNE_NETUNSHARE = 0x00000400
    SHCNE_ATTRIBUTES = 0x00000800 # 속성 변경 시 유용
    SHCNE_UPDATEDIR = 0x00001000 # 디렉토리 내용 변경 시
    SHCNE_UPDATEITEM = 0x00002000 # 특정 항목 업데이트 시 (아이콘 변경에 적합)
    SHCNE_SERVERDISCONNECT= 0x00004000
    SHCNE_UPDATEIMAGE = 0x00008000 # 이미지 목록의 아이콘 변경 시
    SHCNE_DRIVEADDGUI = 0x00010000
    SHCNE_RENAMEFOLDER = 0x00020000
    SHCNE_FREESPACE = 0x00040000
    SHCNE_EXTENDED_EVENT = 0x04000000
    SHCNE_ASSOCCHANGED = 0x08000000 # 전역 변경 알림 (과도할 수 있음)
    SHCNE_DISKEVENTS = 0x0002381F
    SHCNE_GLOBALEVENTS = 0x0C0581E0 # Should be SHCNE_ALLEVENTS?
    SHCNE_ALLEVENTS = 0x7FFFFFFF
    SHCNE_INTERRUPT = 0x80000000

    # SHChangeNotify 플래그
    SHCNF_IDLIST = 0x0000 # dwItem1, dwItem2가 PIDL임을 의미
    SHCNF_PATHA = 0x0001 # dwItem1, dwItem2가 ANSI 경로 문자열임을 의미
    SHCNF_PRINTERA = 0x0002 # dwItem1, dwItem2가 ANSI 프린터 이름임을 의미
    SHCNF_DWORD = 0x0003 # dwItem1, dwItem2가 DWORD 값임을 의미
    SHCNF_PATHW = 0x0005 # dwItem1, dwItem2가 유니코드 경로 문자열임을 의미 (권장)
    SHCNF_PRINTERW = 0x0006 # dwItem1, dwItem2가 유니코드 프린터 이름임을 의미
    SHCNF_TYPE = 0x00FF
    SHCNF_FLUSH = 0x1000 # 시스템 이벤트 큐가 비워질 때까지 대기
    SHCNF_FLUSHNOWAIT = 0x3000 # 즉시 알림 처리 요청 (권장)

    # SHChangeNotify 함수 프로토타입 정의
    sh_change_notify = shell32.SHChangeNotify
    sh_change_notify.argtypes = (wintypes.LONG, wintypes.UINT, wintypes.LPCVOID, wintypes.LPCVOID)
    sh_change_notify.restype = None # 반환 값 없음

    def notify_shell_of_change(path, event=SHCNE_UPDATEITEM, flags=SHCNF_PATHW | SHCNF_FLUSHNOWAIT):
    """지정된 경로의 변경 사항을 Windows Shell에 알립니다."""
    try:
    # 경로를 LPCWSTR (유니코드 문자열 포인터) 타입으로 전달
    sh_change_notify(event, flags, ctypes.c_wchar_p(path), None)
    print(f"Sent SHChangeNotify for path: {path} with event: {event:#010x}")
    except Exception as e:
    print(f"Error sending SHChangeNotify: {e}")

    # 사용 예시:
    # folder_to_update = r"C:\MyFolder"
    # notify_shell_of_change(folder_to_update)
    # 속성 변경 후:
    # notify_shell_of_change(folder_to_update, event=SHCNE_ATTRIBUTES)

wEventId와 uFlags의 선택은 매우 중요합니다. SHCNE_ASSOCCHANGED와 같이 너무 광범위한 이벤트를 사용하면 전역적인 갱신을 유발하여 느리거나 시각적으로 방해가 될 수 있습니다.25 반면, SHCNE_UPDATEITEM이나 SHCNE_ATTRIBUTES와 같이 더 구체적인 이벤트를 SHCNF_PATHW 플래그와 함께 사용하면 영향을 받는 폴더에 대해 더 정밀하게 갱신을 요청할 수 있습니다. SHCNF_FLUSHNOWAIT 플래그는 알림이 지연 없이 즉시 처리되도록 요청하는 데 중요합니다. 이러한 목표 지향적인 접근 방식은 빈번한 변경을 부드럽게 처리하는 데 핵심적입니다. 일부 자료에서는 SHChangeNotify를 사용해도 지연이 발생할 수 있다고 보고하는데 13, 이는 타이밍 문제이거나 특정 상황에서는 SHCNE_UPDATEITEM만으로는 부족하여 약간 더 넓은 범위의 이벤트가 필요할 수 있음을 시사합니다. 하지만 항상 가장 구체적인 이벤트부터 시도하는 것이 좋습니다.

3. 대안적인 (덜 이상적인) 갱신 방법

SHChangeNotify가 가장 권장되는 방법이지만, 다른 대안들도 존재하며 각각의 단점이 있습니다.

  • ie4uinit.exe 명령 실행: os.system이나 subprocess 모듈을 사용하여 ie4uinit.exe -ClearIconCache (구형 Windows) 또는 ie4uinit.exe -show (Windows 10 이상) 명령을 실행할 수 있습니다.8
    • 단점: SHChangeNotify보다 덜 정교하며, 외부 프로세스를 생성해야 합니다. 효과가 일정하지 않을 수 있고, 세밀한 제어가 어렵습니다. 관리자 권한이 필요할 수도 있습니다.
  • 탐색기(Explorer) 재시작: taskkill /f /im explorer.exe 명령으로 탐색기 프로세스를 강제 종료한 후, start explorer.exe 명령으로 다시 시작하는 방법입니다.14
    • 단점: 사용자에게 매우 방해가 됩니다. 모든 탐색기 창이 닫히고 작업 표시줄이 사라졌다 다시 나타납니다. 스크립트 실행 중에 탐색기를 종료하면 스크립트 자체도 영향을 받을 수 있으므로 주의 깊게 처리해야 합니다(예: 별도의 프로세스나 배치 파일에서 재시작 실행). 원활한 백그라운드 작업에는 적합하지 않습니다.
  • 수동 캐시 삭제: %localappdata%\Microsoft\Windows\Explorer (또는 구형 버전에서는 %localappdata%) 폴더에 있는 IconCache.db 파일을 직접 삭제하는 방법입니다.21 일반적으로 탐색기 프로세스가 이 파일을 사용 중이므로, 삭제 전에 탐색기를 종료해야 합니다.27
    • 단점: 탐색기 재시작과 동일한 사용자 불편을 초래합니다. 잠긴 파일을 처리해야 하며, 잘못 수행될 경우 예기치 않은 문제가 발생할 수 있습니다.28
  • 기타 방법: 화면 해상도나 배율 변경 30, 아이콘 크기 메트릭 변경 24 등 때때로 제안되는 덜 신뢰성 있는 방법들도 있지만, 이는 견고한 프로그래밍적 해결책이 아닙니다. 또한, 동일한 아이콘 파일 이름을 반복해서 사용할 때 발생하는 캐싱 문제를 해결하기 위해 아이콘 파일 이름을 변경하는 방법도 언급되었습니다.25

V. 견고한 Python 솔루션 구축

실제 애플리케이션에서는 단순히 아이콘을 변경하는 것 외에도 여러 가지 현실적인 문제들을 고려하여 견고한 솔루션을 구축해야 합니다.

1. 폴더 이동 및 배포 처리

  • 문제점: 사용자가 아이콘이 사용자 지정된 폴더를 다른 위치로 이동하거나 복사하면 아이콘이 기본 상태로 돌아갈 수 있습니다. 이는 desktop.ini 파일이 절대 경로를 사용했거나, 아이콘 파일(.ico)이 폴더와 함께 이동되지 않았기 때문일 수 있습니다.10 또한, 복사 과정에서 폴더의 읽기 전용 속성이 손실될 수도 있습니다.10
  • 해결책 1: 상대 경로 및 내장 아이콘: 가장 좋은 방법은 사용할 .ico 파일을 대상 폴더 안에 복사해 넣고, desktop.ini 파일 내에서는 상대 경로(예: IconResource=my_icon.ico,0)를 사용하는 것입니다.2 이렇게 하면 폴더와 아이콘 설정이 하나의 단위로 묶여 이동 및 배포가 용이해집니다. Python 스크립트는 필요에 따라 아이콘 파일을 대상 폴더로 복사하는 로직을 포함해야 합니다. 이는 10에서 언급된 "배포 가능(Distributable)" 플래그의 개념과 일치합니다.
  • 해결책 2: 설정 재적용: 폴더 이동이나 복사가 빈번하게 발생한다면, 스크립트가 이러한 이벤트를 감지(가능하다면)하거나, 사용자가 수동으로 "아이콘 복구" 기능을 실행하여 desktop.ini를 다시 작성하고 속성을 재적용하도록 하는 기능을 제공할 수 있습니다 (FolderIco의 복구 기능과 유사 10).

2. 오류 처리 및 권한

  • 파일 시스템 작업 및 API 호출 주변에는 견고한 try...except 블록을 사용하여 예외를 처리해야 합니다.15
  • Win32 API 호출의 경우, 반환 값을 확인하고 실패 시 ctypes.get_last_error()를 사용하여 오류 코드를 얻어 원인을 진단해야 합니다.15
  • Program Files와 같은 보호된 위치의 파일/폴더를 수정하거나 특정 속성을 설정하려면 관리자 권한이 필요할 수 있습니다.15 스크립트는 PermissionError와 같은 예외를 적절히 처리하거나 사용자에게 권한 상승이 필요함을 알려야 합니다.

3. 잠재적 충돌

  • 클라우드 동기화 소프트웨어: Dropbox, OneDrive와 같은 클라우드 스토리지 동기화 도구는 동기화 과정에서 desktop.ini 파일을 무시하거나 파일 속성을 재설정하여 사용자 지정 아이콘을 방해할 수 있습니다.7 이에 대한 완벽한 프로그래밍적 해결책은 없을 수 있으며, 주기적으로 설정을 재적용하거나 문제가 발생하는 것으로 알려진 동기화 폴더에서는 사용자 지정을 피하는 것이 현실적인 대안일 수 있습니다.
  • 다른 사용자 지정 도구: FolderMarker 1나 FolderIco 10와 같은 다른 폴더 사용자 지정 소프트웨어가 동시에 사용될 경우 충돌이 발생할 수 있습니다. Python 스크립트가 유일한 관리자가 되도록 하거나, 다른 도구와 적절히 조율되도록 주의해야 합니다.

4. 아이콘 캐시 지속성 문제

25에서 지적된 미묘한 문제가 있습니다. 갱신 알림(SHChangeNotify)을 보내더라도, 폴더의 아이콘을 변경하면서 desktop.ini에 참조된 아이콘 파일의 이름을 동일하게 유지하면, Windows는 여전히 해당 파일 이름과 연관된 이전 캐시 아이콘을 표시할 수 있습니다. 제안된 해결책은 변경 시마다 다른 아이콘 파일 이름을 사용하거나, 더 강력한 갱신 방법을 사용하는 것입니다. 이는 동일한 폴더에 대해 다른 아이콘으로 빈번하게 변경할 때, 단순히 desktop.ini를 업데이트하고 SHChangeNotify를 호출하는 것만으로는 충분하지 않을 수 있음을 시사합니다. 특히 아이콘 파일의 내용은 변경되었지만 이름은 그대로인 경우 문제가 될 수 있습니다. 견고한 전략은 새 아이콘을 고유한 이름(예: 타임스탬프나 해시 기반 이름)으로 저장하거나, 원하는 아이콘을 폴더 내의 표준 이름(예: folder_icon.ico)으로 복사하여 파일 내용이 실제로 변경되도록 보장하는 것일 수 있습니다.

VI. 통합된 최적 실행 방안 및 코드

지금까지 논의된 내용을 바탕으로, Windows에서 Python을 사용하여 폴더 아이콘을 안정적이고 즉각적으로 변경하기 위한 최적의 통합 접근 방식을 제시합니다.

1. 권장 단계 요약

  1. 사용할 .ico 파일을 선택하거나 준비합니다.
  2. (권장) .ico 파일을 대상 폴더 내부에 복사합니다.
  3. Python을 사용하여 대상 폴더 내에 desktop.ini 파일을 UTF-16 인코딩으로 작성하거나 덮어씁니다. IconResource 항목에는 (상대 경로를 사용하는 경우) 폴더 내 아이콘 파일의 상대 경로를 지정합니다.
  4. Python의 ctypes 모듈을 사용하여 kernel32.dll의 SetFileAttributesW 함수를 호출하여 폴더 자체에 읽기 전용(Read-Only) (또는 시스템(System)) 속성을 설정합니다.
  5. ctypes를 사용하여 SetFileAttributesW 함수를 호출하여 desktop.ini 파일에 숨김(Hidden) 및 시스템(System) 속성을 설정합니다.
  6. ctypes를 사용하여 shell32.dll의 SHChangeNotify 함수를 호출합니다. 이때 wEventId는 SHCNE_UPDATEITEM (또는 SHCNE_ATTRIBUTES, SHCNE_UPDATEDIR 등 상황에 맞게), uFlags는 SHCNF_PATHW | SHCNF_FLUSHNOWAIT로 설정하고, 변경된 폴더 경로를 전달하여 즉각적인 Shell 갱신을 트리거합니다.

2. 통합 Python 함수 예제

다음은 위 단계를 모두 포함하는, 주석이 달린 Python 함수 예제입니다. 폴더 경로와 아이콘 파일 경로를 입력으로 받으며, 오류 처리 로직을 포함합니다.

Python

# 이전 섹션의 함수 정의들 (write_desktop_ini, set_folder_attributes_for_icon,
# set_desktop_ini_attributes, notify_shell_of_change)이
# 이 코드 앞에 정의되어 있다고 가정합니다.

import os
import shutil
import ctypes
from ctypes import wintypes
import stat

# --- Windows 파일 속성 상수 ---
FILE_ATTRIBUTE_READONLY = 0x0001
FILE_ATTRIBUTE_HIDDEN = 0x0002
FILE_ATTRIBUTE_SYSTEM = 0x0004
FILE_ATTRIBUTE_DIRECTORY = 0x0010
FILE_ATTRIBUTE_NORMAL = 0x0080
INVALID_FILE_ATTRIBUTES = -1

# --- SHChangeNotify 관련 상수 ---
SHCNE_UPDATEITEM = 0x00002000
SHCNE_UPDATEDIR = 0x00001000
SHCNE_ATTRIBUTES = 0x00000800
SHCNF_PATHW = 0x0005
SHCNF_FLUSHNOWAIT = 0x3000

# --- kernel32 및 shell32 DLL 로드 및 함수 정의 ---
try:
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
shell32 = ctypes.WinDLL('shell32', use_last_error=True)

get\_file\_attributes \= kernel32.GetFileAttributesW  
get\_file\_attributes.argtypes \= (wintypes.LPCWSTR,)  
get\_file\_attributes.restype \= wintypes.DWORD

set\_file\_attributes \= kernel32.SetFileAttributesW  
set\_file\_attributes.argtypes \= (wintypes.LPCWSTR, wintypes.DWORD)  
set\_file\_attributes.restype \= wintypes.BOOL

sh\_change\_notify \= shell32.SHChangeNotify  
sh\_change\_notify.argtypes \= (wintypes.LONG, wintypes.UINT, wintypes.LPCVOID, wintypes.LPCVOID)  
sh\_change\_notify.restype \= None  

except Exception as e:
print(f"Error loading DLLs or defining functions: {e}")
# 이 경우 핵심 기능 사용 불가하므로, 이후 함수 실행을 막는 것이 좋음
kernel32 = None
shell32 = None

# --- Helper Functions (이전에 정의된 내용) ---

def write_desktop_ini(folder_path, icon_path, icon_index=0):
ini_path = os.path.join(folder_path, 'desktop.ini')
content = f"""
IconResource={icon_path},{icon_index}

Mode=
Vid=
FolderType=Generic
"""
try:
with open(ini_path, 'w', encoding='utf-16') as f:
f.write(content)
print(f"Successfully wrote desktop.ini to {ini_path}")
return True
except Exception as e:
print(f"Error writing desktop.ini: {e}")
return False

def set_folder_attributes_for_icon(folder_path):
if not kernel32: return False
try:
current_attrs = get_file_attributes(folder_path)
if current_attrs == INVALID_FILE_ATTRIBUTES:
raise ctypes.WinError(ctypes.get_last_error())
new_attrs = current_attrs | FILE_ATTRIBUTE_READONLY
if not set_file_attributes(folder_path, new_attrs):
raise ctypes.WinError(ctypes.get_last_error())
print(f"Successfully set ReadOnly attribute on folder: {folder_path}")
return True
except Exception as e:
print(f"Error setting folder attributes for {folder_path}: {e}")
return False

def set_desktop_ini_attributes(ini_path):
if not kernel32: return False
try:
current_attrs = get_file_attributes(ini_path)
if current_attrs == INVALID_FILE_ATTRIBUTES:
raise ctypes.WinError(ctypes.get_last_error())
new_attrs = current_attrs | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM
if not set_file_attributes(ini_path, new_attrs):
raise ctypes.WinError(ctypes.get_last_error())
print(f"Successfully set Hidden+System attributes on: {ini_path}")
return True
except Exception as e:
print(f"Error setting desktop.ini attributes for {ini_path}: {e}")
return False

def notify_shell_of_change(path, event=SHCNE_UPDATEITEM, flags=SHCNF_PATHW | SHCNF_FLUSHNOWAIT):
if not shell32: return
try:
sh_change_notify(event, flags, ctypes.c_wchar_p(path), None)
print(f"Sent SHChangeNotify for path: {path} with event: {event:#010x}")
except Exception as e:
print(f"Error sending SHChangeNotify: {e}")

# --- Main Function ---

def set_folder_icon(folder_path, icon_path, use_relative_path=True, force_refresh=True):
"""
Python을 사용하여 Windows 폴더의 사용자 지정 아이콘을 설정합니다.

Args:  
    folder\_path (str): 대상 폴더의 절대 경로.  
    icon\_path (str):.ico 파일의 절대 경로.  
    use\_relative\_path (bool): True이면 아이콘을 폴더에 복사하고 상대 경로 사용.  
    force\_refresh (bool): True이면 SHChangeNotify를 호출하여 즉시 아이콘 갱신.

Returns:  
    bool: 성공 시 True, 실패 시 False.  
"""  
if not kernel32 or not shell32:  
    print("Error: Required Windows DLL functions could not be loaded.")  
    return False

if not os.path.isdir(folder\_path):  
    print(f"Error: Folder not found \- {folder\_path}")  
    return False  
if not os.path.isfile(icon\_path):  
    print(f"Error: Icon file not found \- {icon\_path}")  
    return False

target\_icon\_name \= os.path.basename(icon\_path)  
target\_icon\_path\_abs \= os.path.join(folder\_path, target\_icon\_name)  
ini\_path \= os.path.join(folder\_path, 'desktop.ini')

\# \--- 1단계: 아이콘 경로 준비 및 복사 (상대 경로 사용 시) \---  
icon\_resource\_path \= icon\_path \# 기본값은 절대 경로  
if use\_relative\_path:  
    try:  
        \# 대상 폴더에 아이콘 파일 복사 (덮어쓰기)  
        shutil.copy2(icon\_path, target\_icon\_path\_abs)  
        print(f"Copied icon to {target\_icon\_path\_abs}")  
        icon\_resource\_path \= target\_icon\_name \# 상대 이름 사용  
    except Exception as e:  
        print(f"Error copying icon file: {e}")  
        \# 복사 실패 시 절대 경로 사용 또는 False 반환 선택 가능  
        print("Falling back to absolute icon path.")  
        icon\_resource\_path \= icon\_path  
        \# 견고성을 위해 복사 실패 시에도 절대 경로로 진행 시도  
        \# return False \# 또는 복사 실패 시 즉시 종료하려면 주석 해제

\# \--- 2단계: desktop.ini 작성 \---  
if not write\_desktop\_ini(folder\_path, icon\_resource\_path, 0):  
    return False \# 오류는 write\_desktop\_ini 함수에서 이미 출력됨

\# \--- 3단계: 속성 설정 \---  
\# ini 파일이 실제로 생성되었는지 확인 후 속성 설정 시도  
if not os.path.exists(ini\_path):  
     print(f"Error: desktop.ini was not created successfully at {ini\_path}")  
     return False

\# 폴더 속성 설정 (ReadOnly)  
if not set\_folder\_attributes\_for\_icon(folder\_path):  
     \# 필수 실패는 아니지만 오류 기록  
     print(f"Warning: Could not set folder attributes for {folder\_path}")

\# desktop.ini 속성 설정 (Hidden \+ System)  
if not set\_desktop\_ini\_attributes(ini\_path):  
     print(f"Warning: Could not set desktop.ini attributes for {ini\_path}")  
     \# 이 속성 설정 실패는 아이콘 표시에 치명적일 수 있으므로 False 반환 고려  
     \# return False

\# \--- 4단계: Shell 알림 \---  
if force\_refresh:  
    \# 디렉토리 업데이트 먼저 알림  
    notify\_shell\_of\_change(folder\_path, event=SHCNE\_UPDATEDIR)  
    \# 선택적으로 속성 변경도 알림  
    \# notify\_shell\_of\_change(folder\_path, event=SHCNE\_ATTRIBUTES)  
    \# notify\_shell\_of\_change(ini\_path, event=SHCNE\_ATTRIBUTES)  
    \# 항목 업데이트 알림이 가장 효과적일 수 있음 (마지막에 호출)  
    notify\_shell\_of\_change(folder\_path, event=SHCNE\_UPDATEITEM)

print(f"Folder icon setting process completed for {folder\_path}.")  
return True

# --- 사용 예시 ---
# target_folder = r"C:\Path\To\Your\Folder"
# icon_file = r"C:\Path\To\Your\Icons\my_cool_icon.ico"
# success = set_folder_icon(target_folder, icon_file, use_relative_path=True, force_refresh=True)
# if success:
# print("Icon set successfully!")
# else:
# print("Failed to set icon.")

# --- 기본값으로 재설정 ---
# 기본값으로 되돌리려면 desktop.ini 파일을 삭제하고,
# 폴더에서 ReadOnly/System 속성을 제거한 후,
# SHChangeNotify를 호출하는 별도의 함수가 필요합니다.

3. 아이콘 갱신 방법 비교

다음 표는 아이콘 캐시를 갱신하는 다양한 방법들의 장단점을 요약하여 보여줍니다. 빈번하고 안정적인 업데이트가 필요한 경우, 사용자 방해가 적고 프로그래밍 제어가 용이한 방법이 선호됩니다.

갱신 방법신뢰성프로그래밍 제어사용자 방해세분성관리자 권한 (일반적)
SHChangeNotify API높음높음낮음높음필요 없음
ie4uinit.exe 명령중간중간낮음중간필요할 수 있음
탐색기(Explorer) 재시작높음낮음매우 높음낮음필요 없음
수동 캐시 파일 삭제중간낮음매우 높음낮음필요 없음 (탐색기 종료 필요)

이 표는 SHChangeNotify가 다른 대안들에 비해 왜 권장되는지를 명확히 보여줍니다. 높은 신뢰성, 정밀한 제어, 낮은 사용자 방해는 빈번한 아이콘 변경 요구사항에 가장 적합한 특성입니다. 이는 ctypes를 사용하여 다소 복잡해 보이는 API 호출을 구현해야 하는 이유를 정당화합니다.

VII. 결론

Windows 환경에서 Python을 사용하여 폴더 아이콘을 빈번하게 변경하고 즉시 반영해야 하는 요구사항을 충족시키는 가장 효과적이고 신뢰할 수 있는 방법은 desktop.ini 파일 조작, 특정 파일/폴더 속성 설정, 그리고 Windows Shell 알림 메커니즘의 조합을 이용하는 것입니다.

본 보고서를 통해 분석된 핵심 사항은 다음과 같습니다:

  1. desktop.ini 파일: 폴더 아이콘 사용자 지정의 핵심이며, `` 섹션의 IconResource 항목을 통해 아이콘 경로와 인덱스를 지정해야 합니다. 파일은 유니코드(UTF-16 권장)로 인코딩되어야 합니다.
  2. 필수 속성: Windows가 사용자 지정을 인식하려면 폴더 자체에 읽기 전용 또는 시스템 속성이, desktop.ini 파일에는 숨김과 시스템 속성이 반드시 설정되어야 합니다. Python의 표준 os.chmod 함수는 Windows에서 이러한 모든 속성을 설정하기에 불충분합니다.
  3. ctypes와 Win32 API: Python의 ctypes 모듈을 사용하여 kernel32.dll의 SetFileAttributesW 함수를 직접 호출하는 것이 필요한 속성을 설정하는 표준적이고 안정적인 방법입니다.
  4. Shell 갱신: 아이콘 변경 사항을 즉시 반영하려면 Windows의 아이콘 캐싱 동작을 극복해야 합니다. shell32.dll의 SHChangeNotify 함수를 ctypes를 통해 호출하여 Shell에 변경 사항을 알리는 것이 가장 권장되는 방법입니다. 이때 SHCNE_UPDATEITEM과 같은 구체적인 이벤트와 SHCNF_PATHW | SHCNF_FLUSHNOWAIT 플래그를 사용하는 것이 효과적입니다.
  5. 견고성: 실제 적용 시에는 아이콘 파일을 폴더 내에 포함하고 상대 경로를 사용하며, 철저한 오류 처리 및 권한 문제를 고려하고, 클라우드 동기화 소프트웨어와의 잠재적 충돌 및 캐시 지속성 문제(예: 동일 파일명 반복 사용)에 대비해야 합니다.

결론적으로, Windows에서 Python을 통해 폴더 아이콘을 동적으로 관리해야 하는 개발자에게는 desktop.ini 생성, ctypes를 이용한 정확한 속성 설정, 그리고 SHChangeNotify를 통한 즉각적인 Shell 갱신을 통합한 접근 방식을 강력히 권장합니다. 이 방법은 사용자 경험을 저해하지 않으면서도 안정적이고 반응성 좋은 폴더 아이콘 사용자 지정 기능을 구현하는 데 필수적입니다.

引用文献

  1. Change Folder Icon on Windows 11. Detailed step-by-step guide. | Folder Marker Blog, 5月 4, 2025にアクセス、 https://blog.foldermarker.com/ways-to-change-folder-icon-on-windows/
  2. How to Customize Folders with Desktop.ini - Win32 apps | Microsoft Learn, 5月 4, 2025にアクセス、 https://learn.microsoft.com/en-us/windows/win32/shell/how-to-customize-folders-with-desktop-ini
  3. Customising certain folders within a Folder Type (desktop.ini?) - Microsoft Community, 5月 4, 2025にアクセス、 https://answers.microsoft.com/en-us/windows/forum/all/customising-certain-folders-within-a-folder-type/43b163dd-ff3a-4688-b671-d574a09bffd7
  4. How do i change the icon of a folder in windows? - Stack Overflow, 5月 4, 2025にアクセス、 https://stackoverflow.com/questions/72709078/how-do-i-change-the-icon-of-a-folder-in-windows
  5. What is desktop.ini and How to Hide or Delete It? - Geekswipe, 5月 4, 2025にアクセス、 https://geekswipe.net/technology/computing/how-to-hide-desktop-ini-file-or-delete/
  6. Customize Windows folder icon - JIHONGO's Blog, 5月 4, 2025にアクセス、 https://blog.jihongo.com/en/posts/2020/08/08/customize-windows-folder-icon/
  7. Folder icon, desktop.ini and file attributes - Super User, 5月 4, 2025にアクセス、 https://superuser.com/questions/1720951/folder-icon-desktop-ini-and-file-attributes
  8. Dynamically changing Folder Picture using desktop.ini in AHK - AutoHotkey Community, 5月 4, 2025にアクセス、 https://www.autohotkey.com/boards/viewtopic.php?t=134992
  9. Thread: [RESOLVED] Change Folder icons - VBForums, 5月 4, 2025にアクセス、 https://www.vbforums.com/showthread.php?905889-RESOLVED-Change-Folder-icons
  10. What If the Custom Folder Icon Does Not Show?, 5月 4, 2025にアクセス、 https://www.folderico.com/what-if-custom-folder-icon-does-not-show
  11. Can desktop.ini auto update folder icons? : r/Windows11 - Reddit, 5月 4, 2025にアクセス、 https://www.reddit.com/r/Windows11/comments/1b7s6fu/can_desktopini_auto_update_folder_icons/
  12. How do i update folder icons in windows through python : r/learnpython - Reddit, 5月 4, 2025にアクセス、 https://www.reddit.com/r/learnpython/comments/1j3x55i/how_do_i_update_folder_icons_in_windows_through/
  13. desktop.ini problem : r/learnpython - Reddit, 5月 4, 2025にアクセス、 https://www.reddit.com/r/learnpython/comments/ph5543/desktopini_problem/
  14. Change or Restore Desktop Folder Icon in Windows, 5月 4, 2025にアクセス、 https://www.tenforums.com/tutorials/116393-change-restore-desktop-folder-icon-windows-10-a.html
  15. How to Retrieve and Set File Metadata and Attributes in Python | IT trip, 5月 4, 2025にアクセス、 https://en.ittrip.xyz/python/python-file-metadata-attributes
  16. Change file to read-only mode in Python - Stack Overflow, 5月 4, 2025にアクセス、 https://stackoverflow.com/questions/28492685/change-file-to-read-only-mode-in-python
  17. How to remove read-only attrib directory with Python in Windows? - Stack Overflow, 5月 4, 2025にアクセス、 https://stackoverflow.com/questions/4829043/how-to-remove-read-only-attrib-directory-with-python-in-windows
  18. How to Set and Remove Read-Only Attributes from Directories in Python | IT trip, 5月 4, 2025にアクセス、 https://en.ittrip.xyz/python/set-remove-readonly-python
  19. Read-only Windows files with Python - Tech Art Tiki, 5月 4, 2025にアクセス、 http://techarttiki.blogspot.com/2008/08/read-only-windows-files-with-python.html
  20. File Attribute Constants (WinNT.h) - Win32 apps | Microsoft Learn, 5月 4, 2025にアクセス、 https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants
  21. Trying to get the icon to work properly · Issue #2714 · pyinstaller/pyinstaller - GitHub, 5月 4, 2025にアクセス、 https://github.com/pyinstaller/pyinstaller/issues/2714
  22. Icon Cache - Rebuild Windows 10 Forums, 5月 4, 2025にアクセス、 https://www.sevenforums.com/tutorials/49819-icon-cache-rebuild.html
  23. windows - Refresh Icon Cache Without Rebooting - Super User, 5月 4, 2025にアクセス、 https://superuser.com/questions/499078/refresh-icon-cache-without-rebooting
  24. Make Windows refresh icon cache - Stack Overflow, 5月 4, 2025にアクセス、 https://stackoverflow.com/questions/3243317/make-windows-refresh-icon-cache
  25. Is there a way to only update one folder's desktop.ini? - Stack Overflow, 5月 4, 2025にアクセス、 https://stackoverflow.com/questions/71981958/is-there-a-way-to-only-update-one-folders-desktop-ini
  26. python - How to use SHChangeNotify via ctypes or PyWin32 - Stack Overflow, 5月 4, 2025にアクセス、 https://stackoverflow.com/questions/69043036/how-to-use-shchangenotify-via-ctypes-or-pywin32
  27. Python Windows Explorer Force Refresh - Stack Overflow, 5月 4, 2025にアクセス、 https://stackoverflow.com/questions/63875518/python-windows-explorer-force-refresh
  28. Most icons gone after resetting icon cache and restarting. - Microsoft Community, 5月 4, 2025にアクセス、 https://answers.microsoft.com/en-us/windows/forum/all/most-icons-gone-after-resetting-icon-cache-and/a3a7fb5b-417f-4347-b517-e1a39b06333f
  29. How to Rebuild Icon Cache, Clear Thumbnail cache in Windows 10 - Microsoft Community, 5月 4, 2025にアクセス、 https://answers.microsoft.com/en-us/windows/forum/all/how-to-rebuild-icon-cache-clear-thumbnail-cache-in/1e45604c-c8e2-4d6b-9e32-77f07e07bc17
  30. Does anyone ever found out the fix for this that really works? : r/Windows10 - Reddit, 5月 4, 2025にアクセス、 https://www.reddit.com/r/Windows10/comments/q4i0g3/does_anyone_ever_found_out_the_fix_for_this_that/
  31. How to remove read-only attribute recursively on Windows - Super User, 5月 4, 2025にアクセス、 https://superuser.com/questions/653951/how-to-remove-read-only-attribute-recursively-on-windows
No comments to show