Unity - 폴더, 파일 탐색 및 생성

2023. 3. 25. 18:47유니티/기능

대부분 게임을 시작하면, 자동으로 유저의 정보를 저장하는 세이브 데이터가 자동으로 생성됩니다.

이럴 때에는 저장할 경로를 찾아 세이브 폴더와 파일을 생성하는 코드를 필요로 합니다.

 

이미 이전에도 관련해서 글을 쓴 적이 있는데요,

https://dyunace.tistory.com/10

 

Unity - 클라이언트 데이터 저장/불러오기, 파일 유효성 검사

게임을 만들 때, 필수 요소 중 하나는 저장과 불러오기 입니다 데이터를 저장할 때에는 서버에 저장하는 방식과 클라이언트에 저장하는 방식이 있습니다. 클라이언트에 저장하는 방법은 서버에

dyunace.tistory.com

 

 

이번에는 약간의 다른 방법으로, 파일을 탐색하고 생성하는 법을 알아보도록 하겠습니다.

 


먼저 파일을 탐색하고 생성하는 방법에 대해 설명드리겠습니다.

파일에 접근하기 위해서는 System.IO 네임 스페이스가 필요합니다.

이 네임 스페이스가 추가되면, Directory(폴더) 클래스와 File(파일) 클래스를 사용 가능합니다.

using System.IO;

 

 

각각의 클래스에는 Exist 함수가 있습니다.

매개 변수로 string 값을 받으며 여기에 경로를 넣으면 됩니다.

반환값은 bool 로, 해당하는 경로 끝의 이름을 가진 폴더 또는 파일이 있다면 true 를 반환합니다.

Directory.Exist("파일 경로");
File.Exist("파일 경로");

 

또한, 각각의 클래스에는 CreateDirectory, Create 함수가 있습니다.

마찬가지로 매개변수로 string 값을 받으며 여기에 경로를 넣으면 됩니다.

경로 끝의 이름을 가진 폴더 또는 파일을 이전 경로에 생성합니다.

Directory.CreateDirectory("파일 경로");
File.Create("파일 경로");

 


포스팅 초입부에 얘기했던 이전 글의 경우, 파일 경로를 나누고 하나씩 검사를 하는 식이었습니다.

이 방법의 단점은 경로가 길어질 때마다 변수를 하나씩 추가를 해줘야 하는 단점이 있습니다.

다시 보니 노가다가 심하더군요..

 

이번에는 Split (문장 나누기)를 사용해 변수 하나로 자동으로 체크를 하는 코드를 작성해보겠습니다.

 

 

 

우선 파일 탐색을 위한 스크립트를 만들고, 테스트할 파일의 경로를 설정합니다.

저는 아래 예시의 경로를 사용하겠습니다.

using UnityEngine;
using System.IO;    // 파일 탐색을 위한 네임스페이스

public class FindDirFile : MonoBehaviour
{
    string path = "Assets/FindDirFileTest/Save.json";
    
    // 실제 게임을 빌드했을 경우, 이런식으로 사용이 가능하다.
    // string path = Application.persistentDataPath + "/Save/userData.json"
    
    // 경로 참고
    // 회사명은 기본값 DefaultCompany
    // PC : "C:/Users/사용자/AppData/LocalLow/회사명/프로젝트/"
    // IOS : ".../Android/data/com.회사명.프로젝트/files/"
}

 

이 때, 경로 상에 폴더와 파일은 아직 존재하지 않습니다.

(FindDirFile 은 다른 폴더입니다. 헷갈릴까봐 알려드려요)

 

실행 코드는 Start 에서 실행하도록 하겠습니다.

public void Start()
{
    // Split 함수로 문장을 '/' 마다 나누어 배열에 저장한다.
    // 위 예시의 경우 { "Assets", "FindDirFileTest", "Save.json" } 으로 저장된다.
    string[] pathSplit = path.Split('/');

    // 하나씩 탐색하기 위해 변수를 하나 생성한다.
    string curPath = "";

    // 배열의 길이만큼 반복한다.
    for (int i = 0; i < pathSplit.Length; ++i)
    {
        // 배열의 요소(폴더, 파일명)를 추가한다.
        curPath += pathSplit[i];
        print("Find curPath : " + curPath);

        // 배열의 마지막 값이 아니라면 (== 폴더인 경우)
        if (i != pathSplit.Length - 1)
        {
            // 해당하는 폴더가 없으면 실행
            if (!Directory.Exists(curPath))
            {
                // 폴더 생성
                Directory.CreateDirectory(curPath);
                print("create directory");
            }
        }
        // 배열의 마지막 값이면 (== 파일인 경우)
        else
        {
            // 해당하는 파일이 없으면 실행
            if (!File.Exists(curPath))
            {
                // 파일 생성
                FileStream file = File.Create(curPath);
                print("create file");
                
                // 파일은 생성 직후 열려있는 상태이다.
                // 파일을 수정하려면 먼저 파일을 닫아줘야 한다.
                file.Close();
            }
        }

        // 경로 끝에 '/' 을 붙여서 현재 경로를 폴더 경로로 만든다.
        // 2번째 루프가 시작되면 "Assets/" 가 되는 식이다.
        curPath += "/";
    }
}

 

파일 생성 코드에도 주석으로 넣었지만, 다시 설명드리겠습니다.

파일은 생성 직후에는 열려있는 상태가 됩니다.

이 동안에는 파일을 수정하려고 하면 에러가 발생합니다.

따라서 FileStream 타입의 변수를 생성하여 저장한 뒤, Close 함수를 사용해 닫아줘야 합니다.

 

https://dyunace.tistory.com/12

 

Unity - IOException 오류, 유니티 파일 접근 오류

유니티에서 파일에 액세스 한 뒤, 다른 작업을 하려고 할 때에 오류가 발생할 때가 있습니다. 이는 파일이 이미 열려있기 때문에, 수정을 할 수가 없어서 발생하게 됩니다. 액세스 한 파일은 사

dyunace.tistory.com

 

 

이제 스크립트를 오브젝트에 넣고, 프로그램을 실행하면

자동으로 폴더와 파일이 생성됩니다.

실행 직후 생성된 폴더

 

실행 직후 생성된 파일

 

잘 생성이 되는 것을 확인했습니다.

이제 path 변수에 원하는 경로 값으로 바꾸고 사용하시기만 하면 됩니다.

 

 

 


2023.07.04

사용하기 편하게 세이브 로드 매니저 코드를 작성하였습니다.

한줄 만으로 경로 설정, 세이브, 로드를 할 수 있습니다.

https://dyunace.tistory.com/29

 

Unity - 세이브 로드 매니저 (개인용)

이번에 새로 개인용 라이브러리 패키지를 만들고 있는 중입니다. 그 중에서 하나인 세이브 로드 매니저를 공유하려고 합니다. 이거 집어넣고, 한 줄만 작성해도 세이브랑 로드가 되니까 편하더

dyunace.tistory.com