다음을 통해 공유


에서 파일 처리 Xamarin.Forms

파일 처리는 Xamarin.Forms .NET Standard 라이브러리의 코드를 사용하거나 포함된 리소스를 사용하여 수행할 수 있습니다.

개요

Xamarin.Forms 코드는 여러 플랫폼에서 실행되며 각 플랫폼에는 자체 파일 시스템이 있습니다. 이전에는 각 플랫폼에서 원시 파일 API를 사용하여 파일을 읽고 쓰는 것이 가장 쉽게 수행되었다는 것을 의미합니다. 또는 포함 리소스가 앱을 사용하여 데이터 파일을 배포하는 더 간단한 솔루션입니다. 그러나 .NET Standard 2.0을 사용하면 .NET Standard 라이브러리에서 파일 액세스 코드를 공유할 수 있습니다.

이미지 파일 처리에 대한 자세한 내용은 이미지 작업 페이지를 참조하세요.

파일 저장 및 로드

System.IO 클래스는 각 플랫폼의 파일 시스템에 액세스하는 데 사용할 수 있습니다. File 클래스를 사용하여 파일을 만들고, 삭제하고, 삭제할 수 있으며, Directory 클래스를 사용하여 디렉터리의 콘텐츠를 만들거나, 삭제하거나, 열거할 수 있습니다. 또한 파일 작업(예: 파일 내의 압축 또는 위치 검색)을 훨씬 더 효율적으로 제어할 수 있는 Stream 하위 클래스를 사용할 수도 있습니다.

텍스트 파일은 File.WriteAllText 메서드를 사용하여 쓸 수 있습니다.

File.WriteAllText(fileName, text);

텍스트 파일은 File.ReadAllText 메서드를 사용하여 읽을 수 있습니다.

string text = File.ReadAllText(fileName);

또한 File.Exists 메서드는 지정된 파일이 있는지 여부를 확인합니다.

bool doesExist = File.Exists(fileName);

각 플랫폼의 파일 경로는 Environment.SpecialFolder 열거형의 값을 Environment.GetFolderPath 메서드의 첫 번째 인수로 사용하여 .NET Standard 라이브러리에서 확인할 수 있습니다. 그런 다음, Path.Combine 메서드를 사용하여 파일 이름과 결합할 수 있습니다.

string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "temp.txt");

이러한 작업은 텍스트 저장하고 로드하는 페이지가 포함된 샘플 앱에서 보여 줍니다.

텍스트 저장 및 로드

리소스로 포함된 파일 로드

.NET Standard 어셈블리에 파일을 포함시키려면 파일을 만들거나 추가하고 빌드 작업: EmbeddedResource를 확인합니다.

GetManifestResourceStream리소스 ID를 사용하여 포함된 파일에 액세스하는 데 사용합니다. 기본적으로 리소스 ID는 포함된 프로젝트의 기본 네임스페이스가 접두사로 지정된 파일 이름입니다. 이 경우 어셈블리는 WorkingWithFiles 이고 파일 이름은 LibTextResource.txt 리소스 ID입니다 WorkingWithFiles.LibTextResource.txt.

var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LoadResourceText)).Assembly;
Stream stream = assembly.GetManifestResourceStream("WorkingWithFiles.LibTextResource.txt");
string text = "";
using (var reader = new System.IO.StreamReader (stream))
{  
    text = reader.ReadToEnd ();
}

그러면 text 변수를 사용하여 텍스트를 표시하거나 그렇지 않은 경우 코드에서 사용할 수 있습니다. 다음 스크린샷은 컨트롤에 Label 렌더링된 텍스트를 보여줍니다.

.NET 표준 라이브러리에 포함된 텍스트 파일

XML을 로드하고 역직렬화하는 것도 마찬가지로 간단합니다. 다음 코드에서는 리소스에서 로드 및 역직렬화된 다음, 표시할 ListView에 바인딩되는 XML 파일을 보여 줍니다. XML 파일에는 Monkey 개체의 배열이 포함되어 있습니다(클래스는 샘플 코드에서 정의됨).

var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LoadResourceText)).Assembly;
Stream stream = assembly.GetManifestResourceStream("WorkingWithFiles.LibXmlResource.xml");
List<Monkey> monkeys;
using (var reader = new System.IO.StreamReader (stream)) {
    var serializer = new XmlSerializer(typeof(List<Monkey>));
    monkeys = (List<Monkey>)serializer.Deserialize(reader);
}
var listView = new ListView ();
listView.ItemsSource = monkeys;

ListView에 표시되는 .NET 표준 라이브러리에 포함된 Xml 파일

공유 프로젝트에 포함

공유 프로젝트는 파일을 포함 리소스로 포함할 수도 있지만, 공유 프로젝트의 콘텐츠가 참조 프로젝트로 컴파일되므로 포함된 파일 리소스 ID에 사용되는 접두사가 변경될 수 있습니다. 즉 포함된 파일 각각에 대한 리소스 ID가 플랫폼마다 다를 수 있습니다.

공유 프로젝트와 관련된 이 문제에 대한 두 가지 해결 방법은 다음과 같습니다.

  • 프로젝트 동기화 - 동일한 어셈블리 이름과 기본 네임스페이스를 사용하도록 각 플랫폼에 대한 프로젝트 속성을 편집합니다. 이 값은 공유 프로젝트의 포함 리소스 ID에 대한 접두사로 "하드 코드"될 수 있습니다.
  • #if 컴파일러 지시문 - 컴파일러 지시문을 사용하여 올바른 리소스 ID 접두사를 설정하고, 해당 값을 사용하여 올바른 리소스 ID를 동적으로 구성합니다.

두 번째 옵션을 설명하는 코드는 아래와 같습니다. 컴파일러 지시문은 하드 코드된 리소스 접두사(일반적으로 참조 프로젝트에 대한 기본 네임스페이스와 동일함)를 선택하는 데 사용됩니다. 그런 다음, resourcePrefix 변수가 포함 리소스 파일 이름과 연결하여 올바른 리소스 ID를 만드는 데 사용됩니다.

#if __IOS__
var resourcePrefix = "WorkingWithFiles.iOS.";
#endif
#if __ANDROID__
var resourcePrefix = "WorkingWithFiles.Droid.";
#endif

Debug.WriteLine("Using this resource prefix: " + resourcePrefix);
// note that the prefix includes the trailing period '.' that is required
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(SharedPage)).Assembly;
Stream stream = assembly.GetManifestResourceStream
    (resourcePrefix + "SharedTextResource.txt");

리소스 구성

위의 예제에서는 파일이 .NET Standard 라이브러리 프로젝트의 루트에 포함되어 있다고 가정합니다. 이 경우 리소스 ID는 Namespace.Filename.Extension 형식입니다(예: WorkingWithFiles.LibTextResource.txtWorkingWithFiles.iOS.SharedTextResource.txt).

포함 리소스는 폴더에 구성할 수 있습니다. 포함 리소스가 폴더에 배치되면 폴더 이름이 리소스 ID의 일부가 되며(마침표로 구분됨), 리소스 ID 형식은 Namespace.Folder.Filename.Extension이 됩니다. 샘플 앱에 사용된 파일이 MyFolder 폴더에 배치되면 해당 리소스 ID(WorkingWithFiles.MyFolder.LibTextResource.txtWorkingWithFiles.iOS.MyFolder.SharedTextResource.txt)가 됩니다.

포함 리소스 디버깅

특정 리소스가 로드되지 않는 이유를 이해하기 어려운 경우가 있으므로 다음 디버그 코드를 애플리케이션에 임시로 추가하여 리소스가 올바르게 구성되었는지 확인할 수 있습니다. 지정된 어셈블리에 포함된 모든 알려진 리소스를 Errors(오류) 패드로 출력하여 리소스 로드 문제를 디버그하는 데 도움을 줍니다.

using System.Reflection;
// ...
// use for debugging, not in released app code!
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(SharedPage)).Assembly;
foreach (var res in assembly.GetManifestResourceNames()) {
    System.Diagnostics.Debug.WriteLine("found resource: " + res);
}

요약

이 문서에서는 텍스트를 디바이스에 저장 및 로드하고, 포함 리소스를 로드하는 몇 가지 간단한 파일 작업을 보여 주었습니다. .NET Standard 2.0을 사용하면 .NET Standard 라이브러리에서 파일 액세스 코드를 공유할 수 있습니다.