파일 만들기, 쓰기 및 읽기
중요 API
StorageFile 개체를 사용하여 파일을 읽고 씁니다.
참고 항목
전체 샘플에 대해서는 파일 액세스 샘플을 참조하세요.
전제 조건
UWP(유니버설 Windows 플랫폼) 앱에 대한 비동기 프로그래밍 이해
C# 또는 Visual Basic에서 비동기 앱을 작성하는 방법에 대한 자세한 내용은 C# 또는 Visual Basic에서 비동기식 API 호출을 참조하세요. C++/WinRT에서 비동기 앱을 작성하는 방법을 알아보려면 C++/WinRT로 동시성 및 비동기 작업을 참조하세요. C++/CX에서 비동기 앱을 작성하는 방법은 C++/CX의 비동기 프로그래밍을 참조하세요.
읽거나, 쓰거나, 읽고 쓸 파일을 가져오는 방법에 대해 알아봅니다.
파일 선택기로 파일 및 폴더 열기의 파일 선택기를 사용하여 파일을 가져오는 방법을 알아볼 수 있습니다.
파일 생성
앱의 로컬 폴더에 파일을 만드는 방법은 다음과 같습니다. 이미 파일이 있는 경우 대체합니다.
// Create sample file; replace if exists.
Windows.Storage.StorageFolder storageFolder =
Windows.Storage.ApplicationData.Current.LocalFolder;
Windows.Storage.StorageFile sampleFile =
await storageFolder.CreateFileAsync("sample.txt",
Windows.Storage.CreationCollisionOption.ReplaceExisting);
// MainPage.h
#include <winrt/Windows.Storage.h>
...
Windows::Foundation::IAsyncAction ExampleCoroutineAsync()
{
// Create a sample file; replace if exists.
Windows::Storage::StorageFolder storageFolder{ Windows::Storage::ApplicationData::Current().LocalFolder() };
co_await storageFolder.CreateFileAsync(L"sample.txt", Windows::Storage::CreationCollisionOption::ReplaceExisting);
}
// Create a sample file; replace if exists.
StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder;
concurrency::create_task(storageFolder->CreateFileAsync("sample.txt", CreationCollisionOption::ReplaceExisting));
' Create sample file; replace if exists.
Dim storageFolder As StorageFolder = Windows.Storage.ApplicationData.Current.LocalFolder
Dim sampleFile As StorageFile = Await storageFolder.CreateFileAsync("sample.txt", CreationCollisionOption.ReplaceExisting)
파일에 쓰기
StorageFile 클래스를 사용하여 디스크에서 쓰기 가능한 파일에 쓰는 방법은 다음과 같습니다. 파일을 만들자마자 바로 쓰는 것이 아니라면 파일에 쓰는 일반적인 방법을 구성하는 단계들 가운데 첫 번째 단계는 StorageFolder.GetFileAsync로 파일을 가져오는 것입니다.
Windows.Storage.StorageFolder storageFolder =
Windows.Storage.ApplicationData.Current.LocalFolder;
Windows.Storage.StorageFile sampleFile =
await storageFolder.GetFileAsync("sample.txt");
// MainPage.h
#include <winrt/Windows.Storage.h>
...
Windows::Foundation::IAsyncAction ExampleCoroutineAsync()
{
Windows::Storage::StorageFolder storageFolder{ Windows::Storage::ApplicationData::Current().LocalFolder() };
auto sampleFile{ co_await storageFolder.CreateFileAsync(L"sample.txt", Windows::Storage::CreationCollisionOption::ReplaceExisting) };
// Process sampleFile
}
StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder;
create_task(storageFolder->GetFileAsync("sample.txt")).then([](StorageFile^ sampleFile)
{
// Process file
});
Dim storageFolder As StorageFolder = Windows.Storage.ApplicationData.Current.LocalFolder
Dim sampleFile As StorageFile = Await storageFolder.GetFileAsync("sample.txt")
파일에 텍스트 쓰기
FileIO.WriteTextAsync 메서드를 호출하여 파일에 텍스트를 씁니다.
await Windows.Storage.FileIO.WriteTextAsync(sampleFile, "Swift as a shadow");
// MainPage.h
#include <winrt/Windows.Storage.h>
...
Windows::Foundation::IAsyncAction ExampleCoroutineAsync()
{
Windows::Storage::StorageFolder storageFolder{ Windows::Storage::ApplicationData::Current().LocalFolder() };
auto sampleFile{ co_await storageFolder.GetFileAsync(L"sample.txt") };
// Write text to the file.
co_await Windows::Storage::FileIO::WriteTextAsync(sampleFile, L"Swift as a shadow");
}
StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder;
create_task(storageFolder->GetFileAsync("sample.txt")).then([](StorageFile^ sampleFile)
{
//Write text to a file
create_task(FileIO::WriteTextAsync(sampleFile, "Swift as a shadow"));
});
Await Windows.Storage.FileIO.WriteTextAsync(sampleFile, "Swift as a shadow")
버퍼를 사용하여 파일에 바이트 쓰기(2단계)
먼저 CryptographicBuffer.ConvertStringToBinary를 호출하여 파일에 쓰려는 바이트(문자열 기반)의 버퍼를 가져옵니다.
var buffer = Windows.Security.Cryptography.CryptographicBuffer.ConvertStringToBinary( "What fools these mortals be", Windows.Security.Cryptography.BinaryStringEncoding.Utf8);
// MainPage.h #include <winrt/Windows.Security.Cryptography.h> #include <winrt/Windows.Storage.h> #include <winrt/Windows.Storage.Streams.h> ... Windows::Foundation::IAsyncAction ExampleCoroutineAsync() { Windows::Storage::StorageFolder storageFolder{ Windows::Storage::ApplicationData::Current().LocalFolder() }; auto sampleFile{ co_await storageFolder.GetFileAsync(L"sample.txt") }; // Create the buffer. Windows::Storage::Streams::IBuffer buffer{ Windows::Security::Cryptography::CryptographicBuffer::ConvertStringToBinary( L"What fools these mortals be", Windows::Security::Cryptography::BinaryStringEncoding::Utf8)}; // The code in step 2 goes here. }
StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder; create_task(storageFolder->GetFileAsync("sample.txt")).then([](StorageFile^ sampleFile) { // Create the buffer IBuffer^ buffer = CryptographicBuffer::ConvertStringToBinary ("What fools these mortals be", BinaryStringEncoding::Utf8); });
Dim buffer = Windows.Security.Cryptography.CryptographicBuffer.ConvertStringToBinary( "What fools these mortals be", Windows.Security.Cryptography.BinaryStringEncoding.Utf8)
그런 다음, FileIO.WriteBufferAsync 메서드를 호출하여 파일에 버퍼의 바이트를 씁니다.
await Windows.Storage.FileIO.WriteBufferAsync(sampleFile, buffer);
co_await Windows::Storage::FileIO::WriteBufferAsync(sampleFile, buffer);
StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder; create_task(storageFolder->GetFileAsync("sample.txt")).then([](StorageFile^ sampleFile) { // Create the buffer IBuffer^ buffer = CryptographicBuffer::ConvertStringToBinary ("What fools these mortals be", BinaryStringEncoding::Utf8); // Write bytes to a file using a buffer create_task(FileIO::WriteBufferAsync(sampleFile, buffer)); });
Await Windows.Storage.FileIO.WriteBufferAsync(sampleFile, buffer)
스트림을 사용하여 파일에 텍스트 쓰기(4단계)
우선 StorageFile.OpenAsync 메서드를 호출하여 파일을 엽니다. 열기 작업이 완료되면 파일 콘텐츠의 스트림을 반환합니다.
var stream = await sampleFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
// MainPage.h #include <winrt/Windows.Storage.h> #include <winrt/Windows.Storage.Streams.h> ... Windows::Foundation::IAsyncAction ExampleCoroutineAsync() { Windows::Storage::StorageFolder storageFolder{ Windows::Storage::ApplicationData::Current().LocalFolder() }; auto sampleFile{ co_await storageFolder.GetFileAsync(L"sample.txt") }; Windows::Storage::Streams::IRandomAccessStream stream{ co_await sampleFile.OpenAsync(Windows::Storage::FileAccessMode::ReadWrite) }; // The code in step 2 goes here. }
StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder; create_task(storageFolder->GetFileAsync("sample.txt")).then([](StorageFile^ sampleFile) { create_task(sampleFile->OpenAsync(FileAccessMode::ReadWrite)).then([sampleFile](IRandomAccessStream^ stream) { // Process stream }); });
Dim stream = Await sampleFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite)
다음으로,
stream
에서 IRandomAccessStream.GetOutputStreamAt 메서드를 호출하여 출력 스트림을 가져옵니다. C#을 사용하는 경우 using 문에 이 스트림을 묶어 출력 스트림의 수명을 관리합니다. C++/WinRT를 사용하는 경우 블록에서 묶거나 완료되면nullptr
로 설정하여 수명을 제어할 수 있습니다.using (var outputStream = stream.GetOutputStreamAt(0)) { // We'll add more code here in the next step. } stream.Dispose(); // Or use the stream variable (see previous code snippet) with a using statement as well.
Windows::Storage::Streams::IOutputStream outputStream{ stream.GetOutputStreamAt(0) }; // The code in step 3 goes here.
// Add to "Process stream" in part 1 IOutputStream^ outputStream = stream->GetOutputStreamAt(0);
Using outputStream = stream.GetOutputStreamAt(0) ' We'll add more code here in the next step. End Using
이제 다음 코드를(C#을 사용하는 경우 기존 using 문 내에) 추가해 새 DataWriter 개체를 만들고 DataWriter.WriteString 메서드를 호출하여 출력 스트림에 씁니다.
using (var dataWriter = new Windows.Storage.Streams.DataWriter(outputStream)) { dataWriter.WriteString("DataWriter has methods to write to various types, such as DataTimeOffset."); }
Windows::Storage::Streams::DataWriter dataWriter; dataWriter.WriteString(L"DataWriter has methods to write to various types, such as DataTimeOffset."); // The code in step 4 goes here.
// Added after code from part 2 DataWriter^ dataWriter = ref new DataWriter(outputStream); dataWriter->WriteString("DataWriter has methods to write to various types, such as DataTimeOffset.");
Dim dataWriter As New DataWriter(outputStream) dataWriter.WriteString("DataWriter has methods to write to various types, such as DataTimeOffset.")
마지막으로, 다음 코드를(C#을 사용하는 경우 내부 using 문 내에) 추가하여 DataWriter.StoreAsync로 텍스트를 파일에 저장하고 IOutputStream.FlushAsync로 스트림을 닫습니다.
await dataWriter.StoreAsync(); await outputStream.FlushAsync();
dataWriter.StoreAsync(); outputStream.FlushAsync();
// Added after code from part 3 dataWriter->StoreAsync(); outputStream->FlushAsync();
Await dataWriter.StoreAsync() Await outputStream.FlushAsync()
파일에 쓰기 모범 사례
추가 세부 정보 및 모범 사례 지침은 파일에 쓰기 모범 사례를 참조하세요.
파일에서 읽기
StorageFile 클래스를 사용하여 디스크에서 파일을 읽는 방법은 다음과 같습니다. 파일을 읽는 일반적인 방법을 구성하는 단계들 가운데 첫 번째 단계는 StorageFolder.GetFileAsync를 사용해 파일을 가져오는 것입니다.
Windows.Storage.StorageFolder storageFolder =
Windows.Storage.ApplicationData.Current.LocalFolder;
Windows.Storage.StorageFile sampleFile =
await storageFolder.GetFileAsync("sample.txt");
Windows::Storage::StorageFolder storageFolder{ Windows::Storage::ApplicationData::Current().LocalFolder() };
auto sampleFile{ co_await storageFolder.GetFileAsync(L"sample.txt") };
// Process file
StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder;
create_task(storageFolder->GetFileAsync("sample.txt")).then([](StorageFile^ sampleFile)
{
// Process file
});
Dim storageFolder As StorageFolder = Windows.Storage.ApplicationData.Current.LocalFolder
Dim sampleFile As StorageFile = Await storageFolder.GetFileAsync("sample.txt")
파일에서 텍스트 읽기
FileIO.ReadTextAsync 메서드를 호출하여 파일에서 텍스트를 읽습니다.
string text = await Windows.Storage.FileIO.ReadTextAsync(sampleFile);
Windows::Foundation::IAsyncOperation<winrt::hstring> ExampleCoroutineAsync()
{
Windows::Storage::StorageFolder storageFolder{ Windows::Storage::ApplicationData::Current().LocalFolder() };
auto sampleFile{ co_await storageFolder.GetFileAsync(L"sample.txt") };
co_return co_await Windows::Storage::FileIO::ReadTextAsync(sampleFile);
}
StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder;
create_task(storageFolder->GetFileAsync("sample.txt")).then([](StorageFile^ sampleFile)
{
return FileIO::ReadTextAsync(sampleFile);
});
Dim text As String = Await Windows.Storage.FileIO.ReadTextAsync(sampleFile)
버퍼를 사용하여 파일에서 텍스트 읽기(2단계)
먼저 FileIO.ReadBufferAsync 메서드를 호출합니다.
var buffer = await Windows.Storage.FileIO.ReadBufferAsync(sampleFile);
Windows::Storage::StorageFolder storageFolder{ Windows::Storage::ApplicationData::Current().LocalFolder() }; auto sampleFile{ co_await storageFolder.GetFileAsync(L"sample.txt") }; Windows::Storage::Streams::IBuffer buffer{ co_await Windows::Storage::FileIO::ReadBufferAsync(sampleFile) }; // The code in step 2 goes here.
StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder; create_task(storageFolder->GetFileAsync("sample.txt")).then([](StorageFile^ sampleFile) { return FileIO::ReadBufferAsync(sampleFile); }).then([](Streams::IBuffer^ buffer) { // Process buffer });
Dim buffer = Await Windows.Storage.FileIO.ReadBufferAsync(sampleFile)
그런 다음 DataReader 개체를 사용하여 버퍼 길이를 먼저 읽고 뒤 이어 내용을 읽는 것입니다.
using (var dataReader = Windows.Storage.Streams.DataReader.FromBuffer(buffer)) { string text = dataReader.ReadString(buffer.Length); }
auto dataReader{ Windows::Storage::Streams::DataReader::FromBuffer(buffer) }; winrt::hstring bufferText{ dataReader.ReadString(buffer.Length()) };
// Add to "Process buffer" section from part 1 auto dataReader = DataReader::FromBuffer(buffer); String^ bufferText = dataReader->ReadString(buffer->Length);
Dim dataReader As DataReader = Windows.Storage.Streams.DataReader.FromBuffer(buffer) Dim text As String = dataReader.ReadString(buffer.Length)
스트림을 사용하여 파일에서 텍스트 읽기(4단계)
StorageFile.OpenAsync 메서드를 호출하여 파일 스트림을 엽니다. 작업이 완료되면 파일 콘텐츠의 스트림을 반환합니다.
var stream = await sampleFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
Windows::Storage::StorageFolder storageFolder{ Windows::Storage::ApplicationData::Current().LocalFolder() }; auto sampleFile{ co_await storageFolder.GetFileAsync(L"sample.txt") }; Windows::Storage::Streams::IRandomAccessStream stream{ co_await sampleFile.OpenAsync(Windows::Storage::FileAccessMode::Read) }; // The code in step 2 goes here.
StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder; create_task(storageFolder->GetFileAsync("sample.txt")).then([](StorageFile^ sampleFile) { create_task(sampleFile->OpenAsync(FileAccessMode::Read)).then([sampleFile](IRandomAccessStream^ stream) { // Process stream }); });
Dim stream = Await sampleFile.OpenAsync(Windows.Storage.FileAccessMode.Read)
나중에 사용할 스트림의 크기를 가져옵니다.
ulong size = stream.Size;
uint64_t size{ stream.Size() }; // The code in step 3 goes here.
// Add to "Process stream" from part 1 UINT64 size = stream->Size;
Dim size = stream.Size
IRandomAccessStream.GetInputStreamAt 메서드를 호출하여 입력 스트림을 가져옵니다. 이 작업을 사용 문에 넣어 스트림의 수명을 관리합니다. GetInputStreamAt을 호출할 때는 0을 지정하여 스트림의 시작 지점을 설정합니다.
using (var inputStream = stream.GetInputStreamAt(0)) { // We'll add more code here in the next step. }
Windows::Storage::Streams::IInputStream inputStream{ stream.GetInputStreamAt(0) }; Windows::Storage::Streams::DataReader dataReader{ inputStream }; // The code in step 4 goes here.
// Add after code from part 2 IInputStream^ inputStream = stream->GetInputStreamAt(0); auto dataReader = ref new DataReader(inputStream);
Using inputStream = stream.GetInputStreamAt(0) ' We'll add more code here in the next step. End Using
마지막으로 이 코드를 기존의 사용 문에 추가하여 DataReader 개체를 스트림에 가져온 다음 DataReader.LoadAsync와 DataReader.ReadString를 호출하여 텍스트를 읽습니다.
using (var dataReader = new Windows.Storage.Streams.DataReader(inputStream)) { uint numBytesLoaded = await dataReader.LoadAsync((uint)size); string text = dataReader.ReadString(numBytesLoaded); }
unsigned int cBytesLoaded{ co_await dataReader.LoadAsync(size) }; winrt::hstring streamText{ dataReader.ReadString(cBytesLoaded) };
// Add after code from part 3 create_task(dataReader->LoadAsync(size)).then([sampleFile, dataReader](unsigned int numBytesLoaded) { String^ streamText = dataReader->ReadString(numBytesLoaded); });
Dim dataReader As New DataReader(inputStream) Dim numBytesLoaded As UInteger = Await dataReader.LoadAsync(CUInt(size)) Dim text As String = dataReader.ReadString(numBytesLoaded)