게임엔진관련/유니티 엔진

[Unity] 유니티 로컬저장소, url 스트림, 파일(크기,읽기,저장위치, File,Data Path) 관련

AlrepondTech 2019. 7. 9. 11:54
반응형

 

=======================

=======================

=======================

 

 

 

 

 

 

 

 

 

출처: https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.Get.html

 

Parameters
uri The URI of the resource to retrieve via HTTP GET.
Returns
UnityWebRequest An object that retrieves data from the uri.

Description
Create a UnityWebRequest for HTTP GET.

 

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

// UnityWebRequest.Get example

// Access a website and use UnityWebRequest.Get to download a page.
// Also try to download a non-existing page. Display the error.

public class Example : MonoBehaviour
{
    void Start()
    {
        // A correct website page.
        StartCoroutine(GetRequest("https://www.example.com"));

        // A non-existing page.
        StartCoroutine(GetRequest("https://error.html"));
    }

    IEnumerator GetRequest(string uri)
    {
        using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
        {
            // Request and wait for the desired page.
            yield return webRequest.SendWebRequest();

            string[] pages = uri.Split('/');
            int page = pages.Length - 1;

            if (webRequest.isNetworkError)
            {
                Debug.Log(pages[page] + ": Error: " + webRequest.error);
            }
            else
            {
                Debug.Log(pages[page] + ":\nReceived: " + webRequest.downloadHandler.text);
            }
        }
    }
}

 

 

 

 

=======================

=======================

=======================

 

 

 

assets/StreamingAssets/Data/sheet.sht 라는 파일이 있습니다.

 

path = string.Format("jar:file://{0}!/assets/{1}", Application.dataPath, fileName); //filename : Data/text.sht

filestream fs = new filestream(path, filemode.open, fileaccess.read);

 

를 해줬습니다. 그런데 catch에서 파일 경로를 못찾는다고 에러가 뜨네요...

 

같은 경로에 에셋번들을 둔게 있는데 이 에셋번들은 잘 읽어옵니다..

 

20140513 07:04:32 path : jar:file:///data/app/com.KnetP.testSC7-2.apk!/assets/character/warrior.unity3d

20140513 07:09:04 path : jar:file:///data/app/com.KnetP.testSC7-2.apk!/assets/Data/sheet.sht

 

첫번째가 에셋번들 읽어온 경로를 찍은 거고요. 두번째가 .sht파일을 읽어온 경로입니다.

 

두번재 파일에 에러가

Could not find a part of the path "/jar:file:/data/app/com.KnetP.testSC7-2.apk!/assets/Data/sheet.sht"

라고 에러가 뜹니다...

 

----------------------------------------------------------------------------------------------------------------------------------------

www로 읽어와야 된다는데....오브젝트가 아닌 filestream에 쓰일 데이터인데 이걸 어떻게 활용해야 하나요...

 

----------------------------------------------------------------------------------------------------------------------------------------

filePath = Application.streamingAssetsPath +  "/" + fileName; 경로 설정해주시고 

WWW www = WWW("file://" + filePath); 
yield return www; 

if(www.isDone) 
{ 
 byte변수 = www.bytes; 
} 
이런식으로 바이트로 읽어와서 쓰시면 되죠!!!!!

 

 

 

 

=======================

=======================

=======================

 

 

 

출처: https://3dmpengines.tistory.com/1745

 

또다른: https://con.cien.or.kr/pages/viewpage.action?pageId=30769676

유니티 데이터 패스 정리

 

테스트한 기기에 따라 결과가 다를 수 있음

 

[윈도우 에디터]

Application.persistentDataPath : 사용자디렉토리/AppData/LocalLow/회사이름/프로덕트이름

파일 읽기 쓰기 가능

Application.dataPath : 프로젝트디렉토리/Assets

Application.streamingAssetsPath : 프로젝트디렉토리/Assets/StreamingAssets

파일 읽기 쓰기 가능

 

 

[윈도우 응용프로그램]

Application.persistentDataPath : 사용자디렉토리/AppData/LocalLow/회사이름/프로덕트이름

파일 읽기 쓰기 가능

Application.dataPath : 실행파일/실행파일_Data

Application.streamingAssetsPath : 실행파일/실행파일_Data/StreamingAssets

파일 읽기 쓰기 가능

 

[맥 에디터]

Application.persistentDataPath : 사용자디렉토리/Library/Caches/unity.회사이름.프로덕트이름

파일 읽기 쓰기 가능

Application.dataPath : 프로젝트디렉토리/Assets

Application.streamingAssetsPath : 프로젝트디렉토리/Assets/StreamingAssets

파일 읽기 쓰기 가능

 

[맥 응용프로그램]

Application.persistentDataPath : 사용자디렉토리/Library/Caches/unity.회사이름.프로덕트이름

파일 읽기 쓰기 가능

Application.dataPath : 실행파일.app/Contents

Application.streamingAssetsPath : 실행파일.app/Contents/Data/StreamingAssets

파일 읽기 쓰기 가능

 

[웹 플랫폼]

웹에서는 명시적인 파일 쓰기 불가능. 애셋번들로 해야함

Application.persistentDataPath : /

Application.dataPath : unity3d파일이 있는 폴더

Application.streamingAssetsPath : 값 없음.

 

[안드로이드 External]

Application.persistentDataPath : /mnt/sdcard/Android/data/번들이름/files

파일 읽기 쓰기 가능

Application.dataPath : /data/app/번들이름-번호.apk

Application.streamingAssetsPath : jar:file:///data/app/번들이름.apk!/assets 

파일이 아닌 WWW로 읽기 가능

 

[안드로이드 Internal] 

Application.persistentDataPath : /data/data/번들이름/files/

파일 읽기 쓰기 가능

Application.dataPath : /data/app/번들이름-번호.apk

Application.streamingAssetsPath : jar:file:///data/app/번들이름.apk!/assets

파일이 아닌 WWW로 읽기 가능

 

[iOS]

Application.persistentDataPath : /var/mobile/Applications/프로그램ID/Documents 

파일 읽기 쓰기 가능

Application.dataPath : /var/mobile/Applications/프로그램ID/앱이름.app/Data

Application.streamingAssetsPath : /var/mobile/Applications/프로그램ID/앱이름.app/Data/Raw 

파일 읽기 가능, 쓰기 불가능

 

http://memocube.blogspot.kr/2014/04/blog-post.html

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: https://wergia.tistory.com/92

 

안드로이드 버전의 빌드에서 디바이스의 로컬 저장소에 파일을 저장하는 법

 

유니티에서 게임을 만들 때, 네트워크로 받아온 파일을 로컬에 저장해야 하는 일이 많다. 특히 게임의 패치 시스템(Patch System)을 만들어야 하는 경우라면 100% 필요한 일이다. 윈도우 버전의 빌드에서는 적당히 원하는 경로에 파일을 저장할 수 있지만, 안드로이드 버전의 빌드에서는 경로마다 읽기/쓰기의 권한이 다르고 제한이 있다.

 

안드로이드의 데이터 경로와 읽기/쓰기 권한은 다음과 같다.

 

[안드로이드 External]
Application.persistentDataPath : /mnt/sdcard/Android/data/com.YourProductName.YourCompanyName/files [파일 읽기/쓰기 가능]
Application.dataPath : /data/app/번들이름-번호.apk
Application.streamingAssetsPath : jar:file:///data/app/번들이름.apk!/assets [파일이 아닌 WWW로 읽기 가능]

 


[안드로이드 Internal] 
Application.persistentDataPath : /Android/data/com.YourProductName.YourCompanyName/files [파일 읽기/ 쓰기 가능]
Application.dataPath : /data/app/번들이름-번호.apk
Application.streamingAssetsPath : jar:file:///data/app/번들이름.apk!/assets [파일이 아닌 WWW로 읽기 가능]

 

위에 적힌 것처럼 네트워크에서 받아온 파일을 로컬에 저장하기 위해서는 읽기/쓰기가 모두 가능한 Application.persistentDataPath의 경로를 사용해야 한다.

 

위의 경로에 원하는 폴더를 만들고자 할 때는 다음의 코드를 참조하면 된다.

 

if (!Directory.Exists(Application.persistentDataPath + "/생성할 폴더 이름"))
{
    Directory.CreateDirectory(Application.persistentDataPath + "/생성할 폴더 이름");
}

 

 

위의 경로에 원하는 파일을 쓰고자 할 때는 다음의 코드를 참조하면 된다.

FileStream fs = new FileStream(Application.persistentDataPath + "/" + "TestFileName.txt", FileMode.Create, FileAccess.Write);
byte[] data = new byte[writeDataSize];
fs.Write(data, 0, (int)writeDataSize);
fs.Close();

 

이 섹션에서 소개한 내용은 제일 처음에 설명했듯이 주로 게임 패치 시스템에 많이 사용되는데, 유니티에서는 게임 패치에 에셋 번들을 많이 사용하는 편이다. 빌드된 에셋 번들은 manifest 파일을 제외하면 공통적으로 나오는 AssetBundles 파일을 비롯해서 주로 확장자 없이 지정한 번들 이름만 적힌 파일이 나오는데, 이렇게 확장자가 없는 에셋 번들 파일을 그대로 사용할 때는, 각 에셋 번들의 이름과 같은 폴더를 생성하려고 하면 폴더 생성에 실패하게 된다. 그렇기 때문에, 에셋 번들의 이름과 같은 이름의 폴더의 생성은 피하거나 에셋 번들 파일의 끝에 ".unity3d"같은 확장자를 붙여주는 것이 좋다.



출처: https://wergia.tistory.com/92 [베르의 프로그래밍 노트]

 

 

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: https://m.cafe.daum.net/aspdotnet/TfYF/171

 

GetFileSystemInfos 메소드를 이용해서 폴더 내부에 존재하는 모든 파일들의 용량을 가져오는데 많이

도움을 줍니다.

 

DirectoryInfo directoryInfo = new DirectoryInfo(dir);
FileSystemInfo[] array = directoryInfo.GetFileSystemInfos();

int sum = 0;
for (int i = 0; i < array.Length; i++)
{
    FileInfo fileInfo = array[i] as FileInfo;
    if (fileInfo != null)
    {
    sum += (int)fileInfo.Length;
    }
}
return sum;

 

 

 

 

 

 

 

=======================

=======================

=======================

 

 

 

출처: https://3dmpengines.tistory.com/1745

유니티 에셋 폴더의 예약된 이름들

유니티에서 몇몇 폴더 이름은 특별한 속성을 가지고 있다.

숨겨진 폴더들

점(.)으로 시작하는 폴더(예. “.UnitTests/”, “.svn/”)는 유니티에 의해 무시된다. 이 폴더에 들어 있는 어떠한 에셋도 임포트되지 않으면 어떠한 스크립트도 컴파일되지 않는다. 또한 프로젝트 뷰에서도 보이지 않는다.

“Standard Assets”

이곳에 위치한 스크립트들은 항상 가장 먼저 컴파일된다. 스크립트는 언어에 따라 Assembly-CSharp-firstpass, Assembly-UnityScript-firstpass, Assembly-Boo-firstpass 중의 하나로 출력된다.

Standard Assets 폴더의 스크립트들은 다른 스크립트들보다 먼저 컴파일 된다. 그로므로 스크립트를 Standard Assets 폴더에 두는 것은 C# 스크립트가 .js 스크립트에 접근할 수 있게 하거나 또는 .js 스크립트가 C# 스크립트에 접근할 수 있게 하기를 위한 한 방법이다.

“Pro Standard Assets”

Standard Assets과 같지만 이곳의 파일들은 Pro 버전에서만 의미가 있다. 이는 여기에 있는 에셋들은 Render Texture나 Screen-space 효과 등과 같은 Pro-only 기능에서만 사용된다는 것을 의미한다.

이 곳의 스크립트들은 먼저 컴파일되며, Pro Standard Assets 폴더 밖의 다른 스크립트(어떠한 언어라도)에서 접근이 가능하다.

“Editor”

Editor는 여러분이 작성한 스크립트가 유니티 에디터 스크립팅 API에 접근할 수 있도록 허가해주는 특별한 폴더 이름이다. 만약 여러분의 스크립트가 UnityEditor 네임스페이스의 클래스나 기능을 사용한다면, Editor라는 폴더 안에 위치해야 한다.

Editor 폴더 안의 스크립트들을 게임 빌드에는 포함되지 않을 것이다. 오직 유니티 에디터에서만 사용된다. 프로젝트에 여러개의 Editor 폴더가 존재해도 된다.

주의: 특수 폴더에 위치하지 않은 Editor 폴더는 프로젝트 어디에서 위치/포함 될 수 있다. 하지만 “Standard Assets”, “Pro Standard Assets”, “Plugins” 안에 위치할 경우, 이 폴더들의 직접적인 자식이어야 한다. 그렇지 않으면 정상적으로 처리되지 않는다. 예를 들어 “My Entension/Scripts/Editor”는 OK이다. 하지만 특수 폴더에 위치할 경우 반드시 ‘Standard Assets/Editor/MyExtension/Scripts”, 또는 “Pro Standard Assets/Editor/My Extension/Scripts”, 또는 “Plugins/Editor/My Extension/Scripts”이어야 한다.

“Plugins”

“Plugin” 폴더는 스크립트에서 접근하기를 원하는 네이티브 플러그인들이 위치하는 곳이다. 이것들은 자동으로 빌드에 포함될 것이다. 이 폴더는 어떠한 다른 폴더 안에 들어가 있으면 안된다( Assets 폴더 최상위에 위치해야 한다)

Windows에서는 네이티브 플러그인들이 .dll 파일들로 존재한다. Mac OS X에서는 .bundle 파일들로 존재한다. Linux에서는 .so 파일들로 존재한다. Standard Assets 폴더와 같이 이 곳의 스크립트들은 먼저 컴파일되며, Plugins 폴더 밖의 스크립트(어떠한 언어라도)에서 접근이 가능하다.

“Plugins/x86”

만약 32-bit나 유니버셜(32와 64 bit 모두) 플랫폼으로 빌드를 하고, 이 하위 폴더가 존재한다면, 이 폴더의 모든 네이티브 플러그인 파일들이 자동으로 빌드에 추가 될 것이다. 만약 이 폴더가 존재하지 않는다면, 유니티는 대신 부모인 Plugin 폴더에서 네이티브 플러그인들을 찾을 것이다.

“Plugins/x86_64”

만약 64-bit이나 유니버셜(32와 64 bit 모두) 플랫폼으로 빌드를 하고, 이 하위 폴더가 존재한다면, 이 폴더의 모든 네이티브 플러그인 파일들이 자동으로 빌드에 추가 될 것이다. 만약 이 폴더가 존재하지 않는다면, 유니티는 대신 부모인 Plugin 폴더에서 네이티브 플러그인들을 찾을 것이다.

만약 유니버셜 빌드를 생성한다면, x86과 x86_64 하위 폴더를 모두 만드는 것을 권장한다. 그리고 32-bit와 64-bit 버전의 네이티브 플러그 인을 적절한 하위 폴더에 넣어 준다.

“Plugins/Android”

Java-based 플러기인에 사용될 안드로이드 프로젝트에 포함시키고 싶은 Java .jar 파일들을 이곳에 위치시킨다. 모든 .so 파일(Android NDK-based 플러그인들)도 역시 포함될 것이다. See http://docs.unity3d.com/Documentation/Manual/PluginsForAndroid.html

“Plugins/iOS”

생성된 Xcode 프로젝트에 어떠한 .a, .m, .mm, .c 또는 .cpp 파일들을 자동으로 (심볼릭 링크로써) 추가하는 제한적이고 간단한 벙법이다. See http://docs.unity3d.com/Documentation/Manual/PluginsForIOS.html

만약 Xcode 프로젝트에 자동으로 파일들을 추가하는 방법에 대해 더 많은 제어를 하고 싶다면, PostprocessBuildPlayer 기능을 사용해야 한다. 이렇게 하는 것은 파일들을 Plugins/iOS 폴더에 위치시키지 않아도 된다. See http://docs.unity3d.com/Documentation/Manual/BuildPlayerPipeline.html

“Resources”

Resources 폴더는 스크립트에서 일반적인 (그리고 권유하는) 직접 참조 (유니티 에디터에서 드래그&드롭하는 스크립트의 변수 등) 하는 대신 파일 경로나 이름으로 에셋들에 접근할 수 있게 해주는 특수 폴더이다.

이러한 이유로 사용할 때 주의 사항이 있다. Resources 폴더의 모든 에들은 비록 사용되지 않더라도 여러분의 빌드에 포함된다. 그 이유는 이 에셋들은 스크립트에 의해 사용되기 때문에 유니티는 리소스 기반의 에셋들이 사용되는지 사용되지 않는지 판단할 수 없기 때문이다.

프로젝트에 여러개의 Resources 폴더를 가질 수 있다. 한 Resources 폴더의 어떠한 이름을 가지는 에셋을 넣어두고 또 다른 Resources 폴더에 같은 이름을 가지는 에셋을 넣어두는 것은 추천하지 않는다.

게임이 한번 빌드되고 나면 모든 Resources 폴더의 모든 에셋들이 에셋을 위한 아카이브로 패킹된다. 이는 기술적으로 최종 빌드에서는 더이상 Resources 폴더가 존재하지 않는 다는 것을 의미한다. 비록 여러분의 코드에서 이들을 마치 프로젝트에 존재하던 경로를 통해 접근하긴 하지만 말이다.

에셋들이 MonoBehavior 스크립트의 변수로 접근될 경우, 이 에셋들은 MonoBehaviour 스크립트가 Instantiate될 때 (즉, 게임 오브젝트나 프리팹이 씬에 존재하게 될 때) 메모리에 한번에 로드 된다는 것을 주목하자. 만약 에셋이 너무 크고 이것이 메모리에 로딩될 때 여러분이 이에 대한 더 많은 제어를 하고 싶다면 이렇게 동작하기를 원치 않을 것이다.

그럴 경우 큰 에셋들을 Resources 폴더에 넣고 Resources.Load를 통해 불러오는 것을 고려해보자. 에셋이 더 이상 사용되지 않을 경우에는 오브젝트에 대해 Object.Destory를 호출한 후 Resources.UnloadUnusedAsset를 호출함으로써 메모리를 해제할 수 있다.

“Editor Default Resources”

이 폴더는 Resources 폴더와 유사하지만 에디터 스크립트들 에서만 의미를 가진다. 만약 에디터 플러그 인에 에셋들(예를 들어 아이콘, GUI 스킨 등)을 로드해야 하지만 빌드에는 포함되어야 하지 않다면 이 폴더를 사용해라 (이러한 파일들은 그냥 Resources 폴더에 넣는다면 빌드에도 포함된다는 것을 의미한다).

에디터 스크립트들은 MonoBehavior 스크립트가 아니기 때문에 에셋에 접근하는 일반적인 방법(즉, 인스펙터를 통한 드래그 & 드랍)을 사용할 수 없다. “Editor Default Resources”는 이를 위한 편리한 방법이다.

“Editor Default Resources”안에 위치한 에셋들에 접근하기 위해서는 EditorGUIUtility.Load를 사용해야 한다.

Resources.Load와 달리 EditorGUIUtility.Load는 로드 하려고 하는 에셋의 파일 이름 확장자를 명시할 필요가 있다. 그러므로 “myPlugin/mySkin” 대신 “myPlugin/mySkin.guiskin”이어야 한다.

EditorGUIUtility.Load에 의해 사용된 메모리를 해제하기 위해서는 오브젝트에 대해 Object.Destroy를 호출한 후 EditorUtility.UnloadUnusedAssets를 호출하라.

알고 있는 바로는 오직 하나의 “Editor Default Resources” 폴더만이 존재할 수 있으며, Assets 폴더 바로 아래에 위치해야 한다.

“Gizmos”

Gizmos.DrawIcon에 사용되는 모든 텍스쳐/아이콘들을 가지는 폴더. 이 폴더의 텍스쳐 에셋들은 이름으로 불려질 수 잇으며, 에디터에서 기즈모로써 화면에 그려진다.

“WebPlayerTemplates”

웹 빌드에 사용되는 디폴트 웹페이지를 교체하기 위해 사용된다. 여기에 위치하는 스크립트들은 전혀 컴파일 되지 않을 것이다. 이 폴더는 Assets 폴더의 최상위에 위치해야 한다.

“StreamingAssets”

이곳에 위치한 파일들은 어떠한 변경도 없이 빌드 폴더에 복사된다(최종 빌드 파일에 포함되어야 하는 모바일과 웹빌드는 제외). 이들의 경로는 플랫폼 마다 다를 수 있으며 Application.streamingAssetsPath((http://docs.unity3d.com/Documentation/ScriptReference/Application-streamingAssetsPath.html))를 통해 접근할 수 있다. Also see http://docs.unity3d.com/Documentation/Manual/StreamingAssets.html

 

link # 1 : http://wiki.unity3d.com/index.php/Special_Folder_Names_in_your_Assets_Folder

link # 2 : http://www.devbb.net/viewtopic.php?f=37&t=1191

 

 

 

 

반응형

 

 

728x90

 

 

 

 

=======================

=======================

=======================

 

 

 

유니티 텍스트 파일 StreamingAssets 폴더에 입출력

 

보통은 Resources 폴더에 입출력을하여 데이터를 저장한다.

Application.dataPath + "/Resource" + "/" + "파일명.txt"

하지만 패킹이 되버리기 때문에 외부에서 수정하기가 힘듦.

using System.IO;
 
string source = ""; //읽어낸 텍스트 할당받는 변수
 
public void WriteData(string strData)
{
    // FileMode.Create는 덮어쓰기.
    FileStream f = new FileStream(Application.dataPath + "/StreamingAssets" + "/" + "text.txt", FileMode.Create, FileAccess.Write);
 
    StreamWriter writer = new StreamWriter(f, System.Text.Encoding.Unicode);
    writer.WriteLine(strData);
    writer.Close();
}
 
public void ReadData()
{
    StreamReader sr = new StreamReader(Application.dataPath + "/StreamingAssets" + "/" + "text.txt");
    source = sr.ReadLine();
    sr.Close();
}

Application.dataPath + "/StreamingAssets" + "/" + "text.txt"

파일 이름은 동적으로 바뀐다면 string 변수로 선언해서 사용할 것.

앞쪽의Application.dataPath + "/StreamingAssets"은 Application.streamingAssetsPath로도 줄여 쓸 수 있다.

 

 

 

 

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: https://docs.unity3d.com/Manual/StreamingAssets.html

Streaming Assets

Most assets in Unity are combined into the project when it is built. However, it is sometimes useful to place files into the normal filesystem on the target machine to make them accessible via a pathname. An example of this is the deployment of a movie file on iOS
 devices; the original movie file must be available from a location in the filesystem to be played by the PlayMovie function.

Any files placed in a folder called StreamingAssets (case-sensitive) in a Unity project will be copied verbatim to a particular folder on the target machine. You can retrieve the folder using the Application.streamingAssetsPath property. It’s always best to use Application.streamingAssetsPath to get the location of the StreamingAssets folder, as it will always point to the correct location on the platform where the application is running.

The location of this folder varies per platform. Please note that these are case-sensitive:

  • On a desktop computer (Mac OS or Windows) the location of the files can be obtained with the following code:path = Application.dataPath + "/StreamingAssets";
  • On iOS, use:path = Application.dataPath + "/Raw";
  • On Android, use:path = "jar:file://" + Application.dataPath + "!/assets/";

On Android, the files are contained within a compressed .jar file (which is essentially the same format as standard zip-compressed files). This means that if you do not use Unity’s WWW class to retrieve the file, you need to use additional software to see inside the .jar archive and obtain the file.

Note: .dll files located in the StreamingAssets folder don’t participate in the compilation.

 

 

 

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

출처: https://ajh322.tistory.com/135

데이터 불러오는 부분

public SaveData LoadData()
{
    DataSaveManager dsm = new DataSaveManager();
    if (Application.platform == RuntimePlatform.Android)
    {
        Debug.Log("안드로이드");
        return dsm.LoadGameData2();
    }
    Debug.Log("PC");
    return dsm.LoadGameData();
    
}

 

//안드로이드
public SaveData LoadGameData2()
{
   string filePath = "file:///"+Application.persistentDataPath + "/data.json";

   SaveData saveData;
   Debug.Log("파일검색:"+filePath);
   WWW www = new WWW(filePath);
   while(!www.isDone) {}
   string dataAsJson = www.text;
   Debug.Log(dataAsJson);
   Debug.Log(dataAsJson != "");
   if (dataAsJson != "") {
      Debug.Log(dataAsJson);
      saveData = JsonUtility.FromJson (dataAsJson);
   } else 
   {
      saveData = new SaveData();
   }
   return saveData;
}

여러가지 방법이 있지만 위처럼 해야지 정상적으로 되더라

www에 while을 사용하지 않고 IEnumerator를 사용하는 경우도 있었는데 데이터의 리턴을 받는 부분에서 PC와 동일한 방식으로 하고싶어서 while을 사용하여 기다려주었음.

데이터 저장하는 부분

public static void SaveData()
{
    DataSaveManager dsm = new DataSaveManager();
    dsm.SaveGameData(saveData);
}

public void SaveGameData(SaveData saveData) {
   Debug.Log("파일 저장!");
   string dataAsJson = JsonUtility.ToJson (saveData);
   Debug.Log(dataAsJson);
   string filePath = Application.persistentDataPath + "/data.json";
   Debug.Log(Application.persistentDataPath + "/data.json");
   Debug.Log(Application.dataPath + gameDataProjectFilePath);
   File.WriteAllText (filePath, dataAsJson);

}

이것말고도 streaming asset에다가 데이터를 넣고 입출력하는 방법으로 시도해보았는데 데이터를 쓰는 부분에서 정상적으로 처리가 안되었다.

streaming asset에다가 데이터를 넣으면 Application.streamingAssetsPath로 접근을 해야하고

 

 

 

 

 

 

=======================

=======================

=======================

 

 

 

출처: https://smilejsu.tistory.com/502

 

Debug.LogWarning("There is no file on local.");

 

// Create New Folder 

string sDirPath;

            sDirPath = Application.persistentDataPath + "/root/configuration";

            DirectoryInfo di = new DirectoryInfo(sDirPath);

            if (di.Exists == false)

            {

                di.Create();

            }

 

 

// Write File 

FileStream fs = new FileStream(Application.persistentDataPath + "/root/configuration/configuration.json", FileMode.CreateNew);

 

byte[] info = new UTF8Encoding(true).GetBytes(source);

        fs.Write(info, 0, info.Length);



 

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: https://green4you.tistory.com/23

파일 생성, 삭제, 체크 함수

 

파일의 생성과 삭제 그리고 파일 유무 체크 시에 사용하는 함수는 

 

using System.IO 네임스페이스 안에 정의 되어 있다.

 

인자값으로 파일의 이름을 포함한 경로를 넣어주면 된다.

 

 

생성

System.IO.File.Create ( string FilePath );

 

삭제

System.IO.File.Delete(  string FilePath  );

 

체크

System.IO.File.Exists(  string FilePath  );

 

중요 팁

 

위 함수를 사용한 후에 파일 입출력등 파일 관련 작업을 하게 되는 경우 정상적으로 작동되지 않는 경우가 발생한다.

 

확인결과  파일사용후 close 시켜주지 않아서 발생하는 문제였다.

 

이같은 문제를 해결하기 위해서는 함수끝에 Close() 를 붙여주면된다.

 

System.IO.File.Create ( string FilePath ).Close() ;

 

System.IO.File.Create ( string FilePath ) 함수는 FileStream 객체를 리턴하게 되는데 위 같이 작성하면 그 객체의 함수를 

호출하게 된다.

 

이 문제에 대한 여러 해결책은 아래 링크를 통해 참조할 수 있다.

http://stackoverflow.com/questions/4680284/system-io-file-create-locking-a-file



출처: https://green4you.tistory.com/23 [Green4You]

 

 

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: https://inasie.tistory.com/25

 

FileInfo 클래스와 DirectoryInfo 클래스

1. FileInfo클래스

파일 정보를 담을 수 있는 멤버들을 제공한다.

예를들어

Name이란 변수엔 파일이름이

FullName이라는 변수엔 디렉토리 Path를 포함한 파일 이름이,

Extension에는 확장자가,

CreationTime에는 파일이 생성된 날짜 등 각종 파일에 관련된 정보들이 들어간다.

 

생성자에는 파일의 FullPath가 들어간다 (당연히 디렉토리까지 포함)

FileInfo fInfo = new FileInfo("c:\\test.txt");

간단하다.

fInfo.Name에는 “test.txt”,

fInfo.FullName에는 “c:\\test.txt” 가 들어가있겠지

 

FileInfo의 모든 멤버는 다음과 같다.

Name Description
Attributes Gets or sets the FileAttributes of the current FileSystemInfo. (Inherited from FileSystemInfo.)
CreationTime Gets or sets the creation time of the current FileSystemInfo object. (Inherited from FileSystemInfo.)
CreationTimeUtc Gets or sets the creation time, in coordinated universal time (UTC), of the current FileSystemInfo object. (Inherited from FileSystemInfo.)
Directory Gets an instance of the parent directory.
DirectoryName Gets a string representing the directory's full path.
Exists Gets a value indicating whether a file exists. (Overrides FileSystemInfo.Exists.)
Extension Gets the string representing the extension part of the file. (Inherited from FileSystemInfo.)
FullName Gets the full path of the directory or file. (Inherited from FileSystemInfo.)
IsReadOnly Gets or sets a value that determines if the current file is read only.
LastAccessTime Gets or sets the time the current file or directory was last accessed. (Inherited from FileSystemInfo.)
LastAccessTimeUtc Gets or sets the time, in coordinated universal time (UTC), that the current file or directory was last accessed. (Inherited from FileSystemInfo.)
LastWriteTime Gets or sets the time when the current file or directory was last written to. (Inherited from FileSystemInfo.)
LastWriteTimeUtc Gets or sets the time, in coordinated universal time (UTC), when the current file or directory was last written to. (Inherited from FileSystemInfo.)
Length Gets the size, in bytes, of the current file.
Name Gets the name of the file. (Overrides FileSystemInfo.Name.)

 

아 물론 멤버변수 말고도 파일 생성/ 삭제 등을 할 수 있도록 메서드도 제공한다.

Name Description
AppendText Creates a StreamWriter that appends text to the file represented by this instance of the FileInfo.
CopyTo Overloaded. Copies an existing file to a new file.
Create Creates a file.
CreateObjRef Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. (Inherited fromMarshalByRefObject.)
CreateText Creates a StreamWriter that writes a new text file.
Decrypt Decrypts a file that was encrypted by the current account using the Encrypt method.
Delete Permanently deletes a file. (Overrides FileSystemInfo.Delete().)
Encrypt Encrypts a file so that only the account used to encrypt the file can decrypt it.
Equals Determines whether the specified Object is equal to the current Object. (Inherited from Object.)
Finalize Allows an Object to attempt to free resources and perform other cleanup operations before the Object is reclaimed by garbage collection. (Inherited fromObject.)
GetAccessControl Overloaded. Gets a FileSecurity object that encapsulates the access control list (ACL) entries for the file described by the current FileInfo object.
GetHashCode Serves as a hash function for a particular type. (Inherited from Object.)
GetLifetimeService Retrieves the current lifetime service object that controls the lifetime policy for this instance. (Inherited from MarshalByRefObject.)
GetObjectData Sets the SerializationInfo object with the file name and additional exception information. (Inherited from FileSystemInfo.)
GetType Gets the Type of the current instance. (Inherited from Object.)
InitializeLifetimeService Obtains a lifetime service object to control the lifetime policy for this instance. (Inherited from MarshalByRefObject.)
MemberwiseClone Overloaded.
MoveTo Moves a specified file to a new location, providing the option to specify a new file name.
Open Overloaded. Opens a file with various read/write and sharing privileges.
OpenRead Creates a read-only FileStream.
OpenText Creates a StreamReader with UTF8 encoding that reads from an existing text file.
OpenWrite Creates a write-only FileStream.
Refresh Refreshes the state of the object. (Inherited from FileSystemInfo.)
Replace Overloaded. Replaces the contents of a specified file with the file described by the current FileInfo object, deleting the original file, and creating a backup of the replaced file.
SetAccessControl Applies access control list (ACL) entries described by a FileSecurity object to the file described by the current FileInfo object.
ToString Returns the path as a string. (Overrides Object.ToString().)

 

 

2. DirectoryInfo클래스

FileInfo에 파일과 관련된 정보가 담겨있다면 DirectoryInfo클래스에는 Directory에 관한 정보가 들어있을 것이다. FileInfo클래스와 마찬가지로 디렉토리 생성/삭제등을 할 수 있는 메소드를 제공한다.

파일과 다른점은 디렉토리인만큼 하위 파일목록과 하위 디렉토리 목록을 불러오는 메소드를 제공한다는 점이다.

리턴타입은 각각 FileInfo배열과 DirectoryInfo배열이다.

즉 다음과 같이 사용할 수 있다.

 

// C: 루트 디렉토리 정보를 가져옴

DirectoryInfo dInfo = new DirectoryInfo("c:\\");

 

// 하위 FileInfo(파일정보) 배열을 받아옴

FileInfo[] fInfoSub = dInfo.GetFiles();

 

// 하위 DirectoryInfo(디렉토리정보) 배열을 받아옴

DirectoryInfo[] dInfoSub = dInfo.GetDirectories();

 

DirectoryInfo에서 제공하는 멤버는 다음과 같다.

Name Description
Attributes Gets or sets the FileAttributes of the current FileSystemInfo. (Inherited from FileSystemInfo.)
CreationTime Gets or sets the creation time of the current FileSystemInfo object. (Inherited from FileSystemInfo.)
CreationTimeUtc Gets or sets the creation time, in coordinated universal time (UTC), of the current FileSystemInfo object. (Inherited from FileSystemInfo.)
Exists Gets a value indicating whether the directory exists. (Overrides FileSystemInfo.Exists.)
Extension Gets the string representing the extension part of the file. (Inherited from FileSystemInfo.)
FullName Gets the full path of the directory or file. (Inherited from FileSystemInfo.)
LastAccessTime Gets or sets the time the current file or directory was last accessed. (Inherited from FileSystemInfo.)
LastAccessTimeUtc Gets or sets the time, in coordinated universal time (UTC), that the current file or directory was last accessed. (Inherited from FileSystemInfo.)
LastWriteTime Gets or sets the time when the current file or directory was last written to. (Inherited from FileSystemInfo.)
LastWriteTimeUtc Gets or sets the time, in coordinated universal time (UTC), when the current file or directory was last written to. (Inherited from FileSystemInfo.)
Name Gets the name of this DirectoryInfo instance. (Overrides FileSystemInfo.Name.)
Parent Gets the parent directory of a specified subdirectory.
Root Gets the root portion of a path.

 

그리고 메소드는 다음과 같다.

Name Description
Create Overloaded. Creates a directory.
CreateObjRef Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. (Inherited fromMarshalByRefObject.)
CreateSubdirectory Overloaded. Creates a subdirectory or subdirectories on the specified path. The specified path can be relative to this instance of the DirectoryInfo class.
Delete Overloaded. Deletes a DirectoryInfo and its contents from a path.
Equals Determines whether the specified Object is equal to the current Object. (Inherited from Object.)
Finalize Allows an Object to attempt to free resources and perform other cleanup operations before the Object is reclaimed by garbage collection. (Inherited fromObject.)
GetAccessControl Overloaded. Gets the access control list (ACL) entries for the current directory.
GetDirectories Overloaded. Returns the subdirectories of the current directory.
GetFiles Overloaded. Returns a file list from the current directory.
GetFileSystemInfos Overloaded. Retrieves an array of strongly typed FileSystemInfo objects representing files and subdirectories of the current directory.
GetHashCode Serves as a hash function for a particular type. (Inherited from Object.)
GetLifetimeService Retrieves the current lifetime service object that controls the lifetime policy for this instance. (Inherited from MarshalByRefObject.)
GetObjectData Sets the SerializationInfo object with the file name and additional exception information. (Inherited from FileSystemInfo.)
GetType Gets the Type of the current instance. (Inherited from Object.)
InitializeLifetimeService Obtains a lifetime service object to control the lifetime policy for this instance. (Inherited from MarshalByRefObject.)
MemberwiseClone Overloaded.
MoveTo Moves a DirectoryInfo instance and its contents to a new path.
Refresh Refreshes the state of the object. (Inherited from FileSystemInfo.)
SetAccessControl Applies access control list (ACL) entries described by a DirectorySecurity object to the directory described by the current DirectoryInfo object.
ToString Returns the original path that was passed by the user. (Overrides Object.ToString().)

 

각각의 사용법과 내용은 참고하면 되겠다.



출처: https://inasie.tistory.com/25 [손끝으로 만드는 세상]

 

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

출처: http://m.cafe.daum.net/aspdotnet/TfYF/171

GetFileSystemInfos 로 디렉토리 파일 용량 가져오기( DirectoryInfo FileSize)

GetFileSystemInfos 메소드를 이용해서 폴더 내부에 존재하는 모든 파일들의 용량을 가져오는데 많이

도움을 줍니다.

 

 

DirectoryInfo directoryInfo = new DirectoryInfo(dir);
FileSystemInfo[] array = directoryInfo.GetFileSystemInfos();

int sum = 0;
for (int i = 0; i < array.Length; i++)
{
    FileInfo fileInfo = array[i] as FileInfo;
    if (fileInfo != null)
    {
    sum += (int)fileInfo.Length;
    }
}
return sum;

 

 

=======================

=======================

=======================

 

 

 

 

*기타관련링크

https://itleader.tistory.com/124

 

https://dodnet.tistory.com/4210

 

https://chameleonstudio.tistory.com/62

 

https://infodbbase.tistory.com/103

 

https://ajh322.tistory.com/135

 

https://m.blog.naver.com/jandibaby1/220372989229

 

https://forum.unity.com/threads/cant-get-path-to-streamingassets-in-android.505569/

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

 

 

 

반응형