Создание, запись и чтение файла
Важные API
Чтение и запись файла с помощью объекта StorageFile .
Примечание.
Полный пример: пример доступа к файлам.
Необходимые компоненты
Общее представление об асинхронном программировании для приложений универсальной платформы Windows (UWP).
Вы можете узнать, как писать асинхронные приложения в C# или Visual Basic, см . статью "Вызов асинхронных API" в C# или Visual Basic. Чтобы узнать, как создавать асинхронные приложения с помощью C++/WinRT, ознакомьтесь с разделом Параллельная обработка и асинхронные операции с помощью C++/WinRT. Чтобы узнать, как создавать асинхронные приложения на C++/CX, ознакомьтесь с разделом Асинхронное программирование на языке C++/CX.
Знание порядка вызова файла для считывания, записи или выполнения обеих этих операций.
Вы можете узнать, как получить файл с помощью средства выбора файлов в Open files и папках с помощью средства выбора.
Создание файла
Вот как создать файл в локальной папке приложения. Если он уже существует, замените его.
// 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)
Далее получите выходной поток, вызвав метод IRandomAccessStream.GetOutputStreamAt из
stream
. Если вы используете 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. Поместите его в инструкцию using для управления временем существования потока. Укажите значение 0 при вызове GetInputStreamAt , чтобы задать положение в начале потока.
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
Наконец, добавьте этот код в существующую инструкцию 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)