기타 기술들(Unity 관련)

MTP(SDCard) 파일 및 폴더 제어

Dean83 2022. 3. 24. 22:19

1. 개요
    - 면접영상이 휴대폰 내부, 혹은 SD Card 에 존재한다.
    - DB의 내용이 변경될 경우, 면접영상 폴더가 변경되어야 한다.

2. 문제점
    - 영상폴더가 많기에, 일일히 사람이 바꾸기엔 시간소요가 크다.
    - 휴대폰 내부 폴더의 경우, 앱에서 폴더명 수정이 가능하나, SD Card는 앱에서 수정이 불가능 하다. (권한이 시스템 권한임)
    - 다른방법을 통해 SD Card 에 있는 폴더명을 변경해야 한다.    
    - 휴대폰을 PC에 연결할 경우, SD Card의 내용을 변경 할 수 있다. 
       - 그러나, 드라이브가 없는 MTP 연결방식으로 연결되므로, 일반적인 Directory 관리 Class 들로는 접근 및 변경이 불가능하다.

3. 해결책  
     - MicroSoft에서 제공하는 Shell32를 사용하여 MTP 의 폴더를 제어할 수있다. 
     - C# 프로젝트를 생성하여 PC 프로그램을 생성하여 동작해야 한다.

4. 사용법
     * UI 가 있는 프로젝트를 만드는것을 추천. 초기 루트 경로를 찾기 위해서 UI 브라우저 사용이 편함.

     - 프로젝트 생성 -> 참조 추가 -> COM -> Mincosoft Shell Controls And Automation 체크하여 참조 추가
     - using Shell32; 추가
     
     - 맴버변수로, public int Hwnd { get; private set; } 추가
     - Shell shell(변수명) = new Shell();
     - Folder folder(변수명) = shell.BrowseForFolder((int)Hwnd,"타이틀명",0,0); 
        - 폴더 선택 UI를 띄우며, MTP의 최상위 폴더 (예 : VideoDir) 선택 가능
     - folder.Items() 를 통해 folder 내 파일, 자식 폴더들을 가져옴
       - 리턴 클래스 : FolderItems 
     - 각 FolderItem인 item(변수명) 에서, Folder folder(변수명) = (item.GetFolder as Folder); 를 통해 자식 폴더를 가져올 수 있다.
     - 재귀호출 함수를 이용해 호출하게 되면, 처음 폴더 선택 Browser (예 : VideoDir) 의 모든 자식 folder들을 접근 할 수 있다.
     - FolderItem 클래스의 맴버변수인 Name을 통해 폴더명을 가져올 수 있고, Name = "문자열" 을 통해 폴더명을 변경 할 수 있다. 

5. 남은 문제점
     - Folder.Items() 혹은 FolderItem.Name 을 통한 폴더명 변경에 시간이 소요되는것인지, 단순 반복문을 통해 작업시, 
       누락되는 자식 항목들이 존재한다. 적절하게 sleep 등을 활용해야 할듯 하다.